23 Июн 2023
3 мин
4271

Что такое тестирование с использованием моков

Узнайте о мок-тестировании – мощном инструменте для изолированного тестирования компонентов системы, его преимуществах и недостатках в этой статье

Содержание

Тестирование с использованием моков (mock testing) – это метод, при котором вместо реальных компонентов системы используются их имитационные заместители, называемые моками (mocks). Это позволяет упростить процесс тестирования, изолировать тестируемый компонент от внешних зависимостей и контролировать поведение зависимых компонентов в ходе тестирования.

Виды заглушек (стабов)

Моки – это лишь один из видов заглушек, используемых при тестировании. В общем случае, заглушки могут быть разделены на следующие виды:

  1. Стабы (stubs) – простейшие заглушки, которые возвращают заранее определенные значения на определенные входные данные.
  2. Моки (mocks) – более продвинутые заглушки, которые позволяют контролировать вызов методов, передачу аргументов и проверку ожидаемого поведения тестируемой системы.
  3. Фейки (fakes) – имитационные объекты, которые имитируют поведение реальных компонентов, но с упрощенной реализацией.
  4. Спайы (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, "Уведомление", "Приветствуем вас в нашей системе!")

Таким образом, с помощью моков мы смогли протестировать поведение системы уведомлений, не завися от реального сервиса отправки писем.

Преимущества и недостатки мок-тестирования

Преимущества:

  • Изоляция тестируемых компонентов от внешних зависимостей.
  • Контроль над поведением зависимых компонентов.
  • Упрощение процесса тестирования.

Недостатки:

  • Может привести к излишней сложности тестов.
  • Моки могут скрывать настоящие проблемы взаимодействия с реальными компонентами.
  • Требует дополнительного времени на написание и поддержку моков.

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

Содержание

Добавить комментарий

Определи профессию по рисунку