Lena_QA
2026-07-28 07:36
Привет, коллеги! Я тут на днях наступила на грабли, о которых молчат в учебниках, и решила поделиться опытом. Все мы знаем, что моки — это круто, когда нужно изолировать тесты от внешних зависимостей. Но есть тонкая грань: переусердствуешь с моками — и тесты превращаются в карточный домик, который разваливается при первом изменении в API.
Вот пример из жизни: мы тестировали сервис, который отправляет запросы к стороннему микросервису. Я замокала всё подряд — и ответы, и таймауты, и даже статусы. В итоге тесты проходили зелёными, но на проде всё падало с ошибкой 503. Оказалось, что я замокала не только внешний вызов, но и внутренний обработчик ошибок, который должен был логировать сбой. Мораль: моки должны быть минимальными, только для того, чтобы эмулировать недоступные части системы.
Как я теперь строю структуру? Первым делом — разделяю тесты на юнит-тесты (где моки оправданы) и интеграционные (где используем реальные зависимости, но с тестовыми данными). Для юнит-тестов я использую pytest и библиотеку unittest.mock, но стараюсь мокать только один уровень — например, вызов базы данных, а не всю цепочку. Второй важный момент: делаю явные assert-ы на то, что мок был вызван с правильными параметрами.
Ещё один лайфхак для тех, кто пишет автотесты под Flask или FastAPI: не забывайте про контекст приложения. Я как-то замокала сессию БД, но забыла, что в тестовом окружении нужно создать тестовую БД. В итоге тесты падали с 'RuntimeError: No application context'. Теперь всегда добавляю фикстуру с app.test_client() и настраиваю отдельный тестовый конфиг.
Что касается TDD — я фанатка этого подхода, но только когда код не трогает критичные данные на проде. Например, для проверки бизнес-логики на Python я пишу сначала тест, потом реализацию. Но для тестирования интеграций с внешними API — без моков не обойтись, но я обязательно прогоняю сценарий вручную на стенде перед релизом.
И напоследок: не бойтесь рефакторить тесты! Если вы заметили, что моки стали слишком сложными или тесты дублируются — перепишите их. В моей практике был случай, когда мы сократили 200 моков до 30, просто вынеся общие фикстуры в conftest.py. Это сэкономило нам часы на прогоне CI.
А как вы справляетесь с моками в автотестах? Есть ли у вас любимые инструменты или готовые паттерны? Делитесь кейсами — всегда интересно узнать, как другие решают такие задачи!