Мокирование зависимостей через unittest.mock
Тема дорожной карты · Python Programming
unittest.mock подменяет сетевые вызовы, клиентов БД, время и другие медленные или недетерминированные зависимости в тестах. Основные инструменты: Mock/MagicMock как заглушки, patch (декоратор/контекстный менеджер) для подмены атрибутов на время теста, AsyncMock для корутин. Главные грабли: патчить нужно там, где имя ищется, а не где определено — myapp.service.requests.get, а не requests.get. Используй spec=/autospec=True, чтобы опечатки всплывали; проверяй вызовы через assert_called_once_with, а не разбором call_args руками.
Как это работает
Мокирование зависимостей через unittest.mock в Python строится на pytest (de facto стандарт) или stdlib unittest. Тесты лежат в tests/ и следуют конвенции test_*.py. pytest обнаруживает тесты автоматически; ассерты — обычный assert (pytest переписывает их для богатого вывода ошибок). Fixtures (@pytest.fixture) — переиспользуемый setup/teardown; параметризация (@pytest.mark.parametrize) гоняет один тест на множестве входов. unittest.mock (или pytest-mock) подменяет коллабораторов в изоляции. coverage.py меряет покрытие по строкам/ветвям.
Когда применять
Тестируйте публичную поверхность каждого модуля с бизнес-логикой; пропускайте тривиальные геттеры и one-line обёртки. Цель — быстрые unit-тесты на чистые функции + integration-тесты на границе (БД, HTTP, файловая система). Mock-айте сайд-эффекты, которыми не управляете (сеть, время, случайность); over-mocking своего кода тестирует mock, а не код. Гоняйте pytest в CI на каждый PR; coverage — дымовой сигнал, не цель (погоня за 100% поощряет тривиальные тесты).
Типичные ошибки
Ловушки Мокирование зависимостей через unittest.mock: тесты, зависящие от порядка (изолированные fixture, не модульные глобалы); тесты, бьющие в реальную сеть или БД без маркировки (@pytest.mark.slow, @pytest.mark.integration) — CI взрывается; тестирование деталей реализации вместо поведения (любой рефакторинг рушит тест); flaky-тесты, на которые забивают (каждый подрывает доверие, пока вся suite не теряет смысл). Карантинить, потом чинить или удалять.
Связанные понятия
Полезные ресурсы
Проверить знания (1)
Загрузка вопросов…