Руководство по автоматизированному тестированию Python — углубленное применение макетного и модульного тестирования
Руководство по автоматизированному тестированию Python — углубленное применение макетного и модульного тестирования

В процессе разработки программного обеспечения автоматическое тестирование является ключевой частью обеспечения качества и стабильности кода. Будучи гибким и мощным языком программирования, Python предоставляет множество инструментов и библиотек для поддержки автоматического тестирования. В этой статье мы углубимся в то, как объединить Mock с модульным тестированием и использовать Python для автоматического тестирования, чтобы повысить надежность и удобство сопровождения кода.

1. Зачем выполнять автоматическое тестирование?

При разработке программного обеспечения по мере увеличения размеров и функциональности проектов ручное тестирование становится все более трудоемким и подвержено ошибкам. Автоматизированное тестирование может помочь нам решить следующие проблемы:

  • Улучшите тестовое покрытие: автоматическое тестирование позволяет быстро и комплексно выполнять тестовые сценарии.,Охватывает больше путей кода и граничных условий.
  • Повышение эффективности разработки. Автоматизированное тестирование позволяет быстро проверить работоспособность функции после внесения изменений, что сокращает временные затраты на ручное тестирование.
  • Гарантированное качество кода: автоматическое тестирование позволяет заранее обнаружить ошибки и потенциальные проблемы в коде.,Повысьте стабильность и удобство сопровождения кода.
img
img

2. Введение в модульное тестирование

Модульное тестирование — основа автоматизированного тестирования.,Он используется для проверки того, что наименьшая единица функции или метода работает должным образом. На Python,Обычно мы используемunittestилиpytestПодождите, пока среда тестирования напишет и выполнит модульные тесты.。

Язык кода:python
кодКоличество запусков:0
копировать
# Пример: модульные тесты, написанные с использованием unittest.
import unittest

def add(a, b):
    return a + b

class TestAddFunction(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(1, 2), 3)
        self.assertEqual(add(-1, 1), 0)

3. Введение в Mock

Mock — это метод моделирования поведения объектов, который может заменять реальные объекты и моделировать их поведение в тестах. Mock обычно используется для решения проблем с зависимостями во время тестирования, таких как вызов внешних сервисов или использование других модулей.

На Python,мы можем использоватьunittest.mockмодули для создания и управленияMockобъект。

Язык кода:python
кодКоличество запусков:0
копировать
# Пример. Создайте объект Mock с помощью unittest.mock.
from unittest.mock import Mock

# Создайте фиктивный объект
mock_obj = Mock()

# Установите поведение Mock-объекта
mock_obj.method.return_value = 42

# Использование фиктивных объектов
result = mock_obj.method()
print(result)  # Выход: 42
картина
картина

4. Объедините Mock с модульным тестированием

Сочетание Mock с модульным тестированием может помочь нам решить следующие проблемы:

  • Имитация внешних зависимостей. Используйте Mock-объекты для имитации внешних служб или зависимых модулей, чтобы избежать неконтролируемых факторов, таких как сеть или файловая система, при модульном тестировании.
  • Изолированная тестовая среда: изолируйте тестовую среду с помощью макетных объектов, чтобы обеспечить стабильность и повторяемость модульного тестирования.
  • Ускорьте выполнение тестов. Макетные объекты могут заменить трудоемкие операции и ускорить выполнение модульных тестов.
Язык кода:python
кодКоличество запусков:0
копировать
# Пример:Сочетание Mock и модульного тестирования
from unittest import TestCase
from unittest.mock import patch

def get_data_from_external_service():
    # Предположим, что это функция, вызывающая внешний сервис.
    # Возврат данных из сервиса
    pass

def process_data():
    # Получить данные из внешних сервисов
    data = get_data_from_external_service()
    # Обработка данных
    pass

class TestDataProcessing(TestCase):
    @patch('__main__.get_data_from_external_service')
    def test_process_data(self, mock_get_data):
        # Установите возвращаемое значение объекта Mock
        mock_get_data.return_value = {'key': 'value'}
        # Вызов тестируемой функции
        result = process_data()
        # Убедитесь, что функция выполняется должным образом.
        self.assertEqual(result, expected_result)

5. Лучшие практики сочетания макетирования и модульного тестирования

При сочетании Mock с модульным тестированием есть несколько рекомендаций, которые помогут нам написать более понятный и удобный в сопровождении тестовый код:

  • Используйте соответствующие Mock-объекты: В соответствии с потребностями теста выберите соответствующий Mock-объект. Иногда нам нужен простой Mock-объект для замены возвращаемого значения функции или метода, а иногда нам может понадобиться более сложный Mock-объект для имитации внешних сервисов или зависимых модулей.
  • Ограничьте область действия Mock: При написании кода тестов,Область использования Mock-объектов должна быть максимально сокращена.,Избегайте чрезмерного пробного тестирования. Слишком большое количество Mock-объектов затруднит понимание и поддержку теста.
  • Сохраняйте независимость тестов: Каждый модульный тест должен быть независимым друг от друга и не должен зависеть от результатов выполнения других тестов. Использование Mock-объектов может помочь нам изолировать тестовую среду и обеспечить независимость теста.
  • Проверьте вызов объекта Mock: При написании кода тестов,Необходимо проверить количество вызовов и параметры Mock-объекта.,Чтобы гарантировать, что тестируемая функция или метод вызывает объект Mock должным образом.
  • В сочетании с инструментами покрытия: Комбинирование инструментов покрытия может помочь нам оценить тестовое покрытие.,Обнаружены непроверенные пути к коду,Дальнейшее улучшение качества тестирования.

6. Расширенное использование Mock-объектов.

тестовая пирамида
тестовая пирамида

В дополнение к базовому использованию Mock-объекта,unittest.mockМодуль также обеспечивает некоторые расширенные возможности использования.,Например:

  • Side Effect: использоватьside_effectПараметры могут быть указаныMockобъектпобочные эффекты,Например, создание исключения или возврат другого значения.
  • Автоматическое создание свойств и методов: МожетиспользоватьspecПараметры создаются автоматическиMockобъект Свойства и методы,Чтобы было проще взаимодействовать с тестируемым объектом.
  • Patch Decorator: использоватьpatch装饰器Может临时替换被тестобъектхарактеристикиилиметод,контролировать свое поведение во время тестирования.

Эти расширенные способы использования могут помочь нам более гибко использовать Mock-объекты для удовлетворения потребностей тестирования в различных сценариях.

7. Практический пример: автоматическое тестирование веб-приложений.

Давайте на практическом примере продемонстрируем, как объединить макетное и модульное тестирование для автоматического тестирования. Предположим, мы разрабатываем простое веб-приложение, содержащее функцию регистрации пользователей.

Язык кода:python
кодКоличество запусков:0
копировать
# Пример: функция регистрации пользователей веб-приложения.
import requests

def register_user(username, password):
    # Отправить запрос на регистрацию
    response = requests.post('https://example.com/register', json={'username': username, 'password': password})
    return response.status_code

Теперь давайте напишем модульный тест,тестregister_userРаботает ли функция так, как ожидалось?。

Язык кода:python
кодКоличество запусков:0
копировать
# Пример. Тестирование функции регистрации пользователей веб-приложения.
from unittest import TestCase
from unittest.mock import patch
import requests

class TestRegisterUser(TestCase):
    @patch('requests.post')
    def test_register_user_success(self, mock_post):
        # Установите возвращаемое значение объекта Mock
        mock_post.return_value.status_code = 200
        # Вызов тестируемой функции
        status_code = register_user('test_user', 'password123')
        # Убедитесь, что функция выполняется должным образом.
        self.assertEqual(status_code, 200)

проходить Использование фиктивных объектов,мы можем моделироватьrequests.postповедение метода,Это изолирует зависимость от внешней сети в модульных тестах.

8. Практический пример: тестирование интеграции API

Помимо модульного тестирования, объекты Mock также играют важную роль в тестировании интеграции API. Допустим, нам нужно протестировать сложную функциональность, включающую вызовы API, но мы не хотим, чтобы каждый тест зависел от реальной службы API. В этот момент могут пригодиться Mock-объекты.

Язык кода:python
кодКоличество запусков:0
копировать
# Пример: тестирование интеграции API
import requests

def fetch_data_from_api(endpoint):
    # Вызов службы API для получения данных
    response = requests.get(f'https://api.example.com/{endpoint}')
    return response.json()

При проведении интеграционного тестирования мы можем использовать Mock-объекты для имитации ответа службы API вместо того, чтобы полагаться на реальную службу API.

Язык кода:python
кодКоличество запусков:0
копировать
# Пример: тестирование интеграции API
from unittest import TestCase
from unittest.mock import patch
import requests

class TestFetchDataFromAPI(TestCase):
    @patch('requests.get')
    def test_fetch_data_from_api(self, mock_get):
        # Установите возвращаемое значение объекта Mock
        mock_get.return_value.json.return_value = {'key': 'value'}
        # Вызов тестируемой функции
        data = fetch_data_from_api('example_endpoint')
        # Убедитесь, что функция выполняется должным образом.
        self.assertEqual(data, {'key': 'value'})

Используя Mock-объекты, мы можем моделировать реакцию внешних сервисов в интеграционных тестах, тем самым изолируя зависимость от внешних сервисов и делая тестирование более управляемым и надежным.

9. Объедините непрерывную интеграцию и развертывание

Автоматизированное тестирование выполняется не только на этапе разработки, его также следует сочетать с процессом непрерывной интеграции и развертывания (CI/CD), чтобы обеспечить качество и стабильность кода.

В среде непрерывной интеграции мы можем интегрировать автоматическое тестирование в процесс сборки после каждой отправки кода, чтобы своевременно обнаруживать и устранять проблемы в коде.

В среде непрерывного развертывания мы можем объединить автоматическое тестирование с процессом развертывания, чтобы гарантировать, что каждый развернутый код полностью протестирован и не создает новых проблем.

image-20240501024409592
image-20240501024409592

10. Область применения и жизненный цикл Mock-объектов

При написании тестового кода необходимо обращать внимание на область действия и жизненный цикл Mock-объекта. Область действия Mock-объектов можно разделить на два типа: глобальную и локальную:

  • Глобальный макет: Глобальный объект Mock влияет на все тестовые случаи в тестовом файле. Обычно нам следует ограничить область действия Mock-объекта текущим тестовым примером, чтобы обеспечить независимость теста.
  • Частичный макет: местныйMockобъекттолько сейчастест Действительно в случае использования,не повлияет на другиетествариант использования。существоватьиспользоватьpatchДекоратор,Можетпроходитьобозначениеautospec=Trueпараметры для созданиятестобъект具有相同属性和метод的Mockобъект,Чтобы гарантировать, что область действия Mock-объекта ограничена текущим тестовым примером.

Кроме того, внимания требует и жизненный цикл Mock-объекта. Обычно макетные объекты воссоздаются перед выполнением каждого тестового примера, чтобы обеспечить независимость и повторяемость тестов. Однако в некоторых случаях нам может потребоваться поделиться состоянием Mock-объекта, чтобы разделить данные между несколькими тестовыми примерами. Этого можно достичь, определив Mock-объект уровня класса в тестовом классе.

image
image

11. Проверка и утверждение фиктивных объектов

При написании кода тестов,Нам нужно проверить количество вызовов и параметры Mock-объекта.,Чтобы гарантировать, что тестируемая функция или метод взаимодействует с Mock-объектом должным образом. для достижения этой цели,unittest.mockМодуль предоставляет ряд методов утверждения.,Например:

  • assert_called_once_with: Убедитесь, что объект Mock вызывается и вызывается только один раз и что параметры соответствуют ожиданиям.
  • assert_called_with: Убедитесь, что объект Mock вызывается и параметры соответствуют ожиданиям.
  • assert_called_once: Убедитесь, что объект Mock вызывается и вызывается только один раз.

С помощью этих методов утверждения мы можем легко проверить поведение Mock-объектов и обеспечить точность и надежность теста.

12. Сложные сцены, объединяющие несколько Mock-объектов.

В реальных проектах нам часто приходится объединять несколько Mock-объектов для моделирования сложных сценариев, таких как:

  • Имитировать возвращаемые значения и исключения от внешних сервисов.
  • Моделируйте поведение запросов и операций к базе данных.
  • Имитировать операции чтения и записи файловой системы.

Правильно комбинируя различные типы Mock-объектов, мы можем охватить больше сценариев тестирования и улучшить покрытие и качество тестирования.

13. Используйте Mock-объекты для тестирования производительности.

Помимо функционального тестирования, Mock-объекты также можно использовать для тестирования производительности. Моделируя трудоемкие операции, мы можем оценить производительность системы при различных нагрузках и обнаружить потенциальные узкие места производительности и возможности для оптимизации.

img
img

Подвести итог

В этой статье мы подробно рассмотрим, как использовать Python для автоматического тестирования, уделив особое внимание сочетанию макетного и модульного тестирования. Мы впервые рассказали о важности автоматического тестирования и модульного тестирования как основы автоматического тестирования. Впоследствии мы подробно представили концепцию и основы использования Mock, а также объединили примеры, чтобы показать, как использовать объекты Mock для моделирования поведения функций и методов в Python.

Далее мы обсудили, как комбинировать Mock с модульным тестированием, моделировать внешние зависимости с помощью Mock-объектов, изолировать тестовую среду, ускорять выполнение тестов и улучшать тестовое покрытие. Мы также поделились некоторыми передовыми практиками для Mock-объектов, включая использование соответствующих Mock-объектов, ограничение области действия Mock, сохранение независимости тестов и т. д.

Кроме того, мы обсудили расширенное использование Mock-объектов, включая Side Effect, автоматическое создание свойств и методов, Patch Decorator и т. д., и продемонстрировали на практических примерах, как применять Mock-объекты для автоматического тестирования в веб-приложениях и операциях с базами данных.

Кроме того, мы также обсудили связанные темы, такие как область действия и жизненный цикл Mock-объектов, проверка и утверждения, сложные сценарии, объединяющие несколько Mock-объектов, а также использование Mock-объектов для тестирования производительности.

Изучая эту статью, читатели смогут глубже понять совместное применение макетного и модульного тестирования и овладеть соответствующими практическими навыками. Рационально используя Mock-объекты, можно улучшить качество и удобство сопровождения тестового кода, тем самым принося больше преимуществ автоматизированному тестированию в процессе разработки программного обеспечения.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose