Вопрос проверяет понимание практических подходов к тестированию интеграций и изоляции внешних зависимостей.
Если внешняя система недоступна, используют mock или stub, которые имитируют её поведение. Это позволяет тестировать код без реального подключения. Иногда поднимают тестовые контейнеры или используют sandbox-окружения. Такой подход делает тесты стабильными и быстрыми.
Интеграционные тесты проверяют взаимодействие компонентов системы, но реальные внешние сервисы часто недоступны или нестабильны. Поэтому применяются специальные техники.
Определение:
Mock — это объект, который имитирует поведение реальной зависимости и возвращает заранее заданные ответы.
Пример:
from unittest.mock import patch
@patch("requests.get")
def test_api(mock_get):
mock_get.return_value.status_code = 200
# вызов функции, использующей requests.get
Плюсы:
Быстро
Стабильно
Не зависит от сети
Минусы:
Не проверяет реальную интеграцию полностью
Stub — более простой объект, который возвращает фиксированные данные.
Пример:
локальный HTTP-сервер с подготовленными ответами
JSON-файлы с примерами ответов
Это полезно, когда нужно проверить обработку реальных структур данных.
Если сервис можно поднять локально:
Используют Docker
Поднимают тестовую БД или брокер
Это ближе к реальной интеграции.
Некоторые внешние API предоставляют тестовые среды:
платежные системы
облачные сервисы
Это позволяет тестировать реальные сценарии без риска.
На практике:
Unit-тесты используют mock
Интеграционные тесты — реальные сервисы
E2E — полный сценарий
Если внешняя система недоступна, используют mock, stub или тестовые контейнеры. Такой подход делает тесты воспроизводимыми и контролируемыми.