Какой уровень покрытия тестами ты обычно достигаешь?
Что проверяют
Понимаете ли вы, что процент покрытия показывает только выполненные строки, а не проверенное поведение. Интервьюеру важно, как вы выбираете, что тестировать. Следом часто спрашивают про порог в CI и про код, который покрыт, но ничем не проверен.
Как отвечать
Назовите свою реальную цифру и сразу контекст: какой проект, какой код, как считали. Дальше каркас:
- инструмент:
coverage.py, чаще черезpytest-cov:pytest --cov=app --cov-branch --cov-report=term-missing. Флаг--cov-branchвключает покрытие ветвлений, без негоifбезelseсчитается покрытым после одного прохода; - порог:
fail_underв секции[tool.coverage.report]файлаpyproject.tomlили--cov-fail-under. Типичная планка для сервиса около 80 процентов, но полезнее следить за покрытием изменений в PR черезdiff-cover, чтобы новый код не приходил без тестов; - разная глубина: доменная логика, расчёты и валидация покрыты почти полностью, тонкий слой над фреймворком меньше, его лучше проверять интеграционными тестами через
TestClientв FastAPI или тестовый клиент Django; - исключения:
# pragma: no coverиomitдля кода, который тестировать бессмысленно, например точек входа. У каждого исключения должна быть причина; - качество тестов: покрытие не видит отсутствия проверок. Мутационное тестирование через
mutmutпоказывает, какие изменения в коде тесты не заметили.
Для Python это особенно важно: без статической проверки типов ошибка в редкой ветке всплывает только в рантайме, поэтому покрытие ветвлений вместе с mypy или pyright даёт заметно больше уверенности, чем одни строки.
Где спотыкаются
Называют число без контекста: «90 процентов», а на вопрос, строки это или ветвления и что исключено, ответа нет.
Гонятся за 100 процентами и пишут тесты без assert, которые просто вызывают функции ради цифры.
Подгоняют метрику через omit, выкидывая из отчёта сложные модули, и измерение теряет смысл.