Как проверить, что исправления и новые функции не нарушили существующий функционал?
Что проверяют
Есть ли у вас система, а не надежда «прогнал руками, вроде работает». Хотят услышать про автотесты, их запуск в CI на каждое изменение и про то, как исправление бага превращается в тест. Следом спрашивают, что делать, если набор тестов идёт сорок минут или тесты нестабильны.
Как отвечать
Опирайтесь на связку из нескольких уровней:
- регрессионный тест на баг: сначала пишете тест, который воспроизводит ошибку и падает, потом исправляете код. Тест остаётся в наборе и не даст багу вернуться;
- юнит-тесты на
pytest: фикстуры,parametrizeдля граничных значений,unittest.mockилиpytest-mockтолько для внешних зависимостей; - интеграционные тесты: реальная база и брокер в контейнерах через
testcontainersили docker compose в CI. Моки не поймают несовместимость с настоящей схемой; - контракт API: схема OpenAPI и тесты на неё, чтобы изменение ответа не сломало клиентов;
- статический анализ:
ruffиmypyловят целый класс ошибок до запуска тестов.
Всё это запускается в CI (GitHub Actions, GitLab CI) на каждый pull request, и слияние блокируется при красном прогоне. Покрытие меряют через pytest-cov с --cov-branch и смотрят не на общий процент, а на то, покрыт ли изменённый код.
Когда набор разросся: параллельный запуск через pytest-xdist (-n auto), --lf для быстрого перезапуска упавших локально, разделение на быстрые тесты на каждый коммит и медленные по расписанию. После релиза страхуют мониторинг ошибок (например, Sentry), фича-флаги и постепенная выкатка, чтобы новый код можно было выключить без отката.
Где спотыкаются
Называют целью 100% покрытия. Покрытие показывает, какие строки выполнились, но не то, что проверены их результаты: тест без проверок даёт зелёную строку и ничего не ловит.
Мокают всё подряд, включая собственный код и базу. Тесты зелёные, а на проде падает запрос, который мок никогда не выполнял.
Перезапускают нестабильные тесты, пока не пройдут. Флаки надо чинить или помечать и разбирать, иначе команда перестаёт верить красному прогону.