Тестирование с использованием моков (mock testing) – это метод, при котором вместо реальных компонентов системы используются их имитационные заместители, называемые моками (mocks). Это позволяет упростить процесс тестирования, изолировать тестируемый компонент от внешних зависимостей и контролировать поведение зависимых компонентов в ходе тестирования.
В онлайн-университете Skypro есть программа «Инженер по тестированию» — на ней ученики осваивают профессию с нуля за 12 месяцев, делают четыре проекта для портфолио. Преподаватели — руководители отделов тестирования и старшие разработчики в ВТБ, Skyeng и других крупных компаниях. 95% выпускников выходят на работу в течение четырех месяцев: в этом помогает центр карьеры.
Виды заглушек (стабов)
Моки – это лишь один из видов заглушек, используемых при тестировании. В общем случае, заглушки могут быть разделены на следующие виды:
- Стабы (stubs) – простейшие заглушки, которые возвращают заранее определенные значения на определенные входные данные.
- Моки (mocks) – более продвинутые заглушки, которые позволяют контролировать вызов методов, передачу аргументов и проверку ожидаемого поведения тестируемой системы.
- Фейки (fakes) – имитационные объекты, которые имитируют поведение реальных компонентов, но с упрощенной реализацией.
- Спайы (spies) – специальные объекты, которые записывают информацию о своем использовании (количество вызовов, переданные аргументы и т. д.), что позволяет анализировать их поведение после выполнения теста.
Пример использования моков
Допустим, у нас есть система, которая отправляет электронные письма пользователям. Вот упрощенный код нашей системы:
class EmailSender: def send_email(self, recipient, subject, message): # Отправка письма с использованием внешнего сервиса pass class NotificationSystem: def __init__(self, email_sender): self.email_sender = email_sender def notify_user(self, user): self.email_sender.send_email(user.email, "Уведомление", "Приветствуем вас в нашей системе!")
В этом примере, если бы мы хотели протестировать метод notify_user
класса NotificationSystem
, нам бы пришлось использовать реальный сервис отправки писем. Однако с помощью моков мы можем создать имитационный объект EmailSender
и контролировать его поведение:
from unittest.mock import Mock # Создаем мок-объект для EmailSender mock_email_sender = Mock(spec=EmailSender) # Создаем экземпляр системы уведомлений с моком вместо реального отправителя писем notification_system = NotificationSystem(mock_email_sender) # Тестируем метод notify_user notification_system.notify_user(test_user) # Проверяем, что метод send_email мок-объекта был вызван с правильными аргументами mock_email_sender.send_email.assert_called_with(test_user.email, "Уведомление", "Приветствуем вас в нашей системе!")
Таким образом, с помощью моков мы смогли протестировать поведение системы уведомлений, не завися от реального сервиса отправки писем.
Инженер по тестированию — важный специалист в сфере IT: без его внимания не обходится ни один программный продукт. В онлайн-университете Skypro обучиться этой профессии можно с нуля за 12 месяцев. За это время вы научитесь проводить ручное и автоматическое тестирование, работать с системами баг-трекинга и Git. В конце учебы получите диплом о профессиональной переподготовке.
Преимущества и недостатки мок-тестирования
Преимущества:
- Изоляция тестируемых компонентов от внешних зависимостей.
- Контроль над поведением зависимых компонентов.
- Упрощение процесса тестирования.
Недостатки:
- Может привести к излишней сложности тестов.
- Моки могут скрывать настоящие проблемы взаимодействия с реальными компонентами.
- Требует дополнительного времени на написание и поддержку моков.
В заключение, мок-тестирование – это мощный инструмент для изолированного тестирования компонентов системы, однако его следует использовать с умом и помнить о возможных недостатках.
Добавить комментарий