Ответ
Покрытие кода (Code Coverage) — это метрика, которая показывает, какой процент исходного кода был выполнен во время прогона автоматизированных тестов. Она помогает выявить непротестированные участки и оценить полноту тестового набора.
Основные виды покрытия:
- Statement coverage (покрытие операторов): какая доля строк кода была выполнена.
- Branch coverage (покрытие ветвлений): какая доля логических ветвлений (например,
if/else) была пройдена в обоих направлениях (true и false). - Function coverage (покрытие функций): какая доля функций или методов в коде была вызвана.
Практический пример (Python с pytest-cov):
# 1. Установка
pip install pytest pytest-cov
# 2. Запуск тестов с генерацией отчета о покрытии
# Отчет будет сгенерирован для кода в директории 'my_project'
pytest --cov=my_project tests/
Важные аспекты:
- 100% покрытие не гарантирует отсутствие ошибок. Тесты могут исполнять код, но не проверять все возможные пограничные случаи или логику.
- Это количественная, а не качественная метрика. Она показывает, что было протестировано, но не как хорошо.
- Целевой показатель. В большинстве проектов стремятся к покрытию в 80-90%, так как достижение 100% часто бывает нерационально дорогим.
Ответ 18+ 🔞
Давай разберём эту тему про покрытие кода, а то у некоторых в голове каша, будто это волшебная палочка от всех багов.
Покрытие кода — это, грубо говоря, счётчик, который показывает, сколько процентов твоего кода пробежалось во время тестов. Как будто ты красишь забор: видно, где прошёл кистью, а где остались сухие, нехоженые места. Нужно оно, чтобы понять, где у тебя в коде сидят нетронутые участки, куда тесты даже нос не сунули.
Какие бывают разновидности этой хуйни:
- Покрытие операторов (Statement coverage): Самый простой замер. Процент строк, которые хоть раз выполнились. Если строка не выполнилась — значит, она как мёртвый груз, и кто знает, что там творится.
- Покрытие ветвлений (Branch coverage): Вот это уже интереснее. Смотрит на все эти твои
if/else. Важно, чтобы тест прошёл и по веткеtrue, и по веткеfalse. А то бывает: написали тест только на счастливый путь, а на случай, когда всё идёт по пизде — тишина, и потом бабах — продакшен падает. - Покрытие функций (Function coverage): Ещё проще. Посчитали, сколько твоих функций или методов кто-то таки вызвал. Если функция ни разу не дернулась — это повод задуматься, а не мёртвый ли код ты пишешь.
Как это применить на практике, например, в Python с pytest-cov:
# 1. Ставим нужную хрень
pip install pytest pytest-cov
# 2. Запускаем тесты и заодно считаем покрытие для кода в папке 'my_project'
pytest --cov=my_project tests/
А теперь, блядь, самое важное, что все постоянно забывают:
- 100% покрытие — это не индульгенция. Код может быть выполнен, но проверять он может полную хуйню. Можно написать тест, который вызывает функцию и даже не смотрит на результат. Покрытие будет 100%, а пользы — ноль, ебать. Оно не ловит логические косяки и пограничные случаи.
- Это цифра, а не оценка качества. Оно показывает сколько, но не насколько хорошо. Можно иметь 95% покрытия дерьмовыми тестами, и они будут хуже, чем 70% покрытия, но умными и цепкими тестами.
- Гнаться за 100% — часто идиотизм. В хороших проектах обычно держатся в районе 80-90%. Потому что последние проценты — это часто обработка каких-то невероятных, космических ошибок, и писать на них тесты — это овердохуища времени и сил, которые никогда не окупятся. Иногда проще оставить эти 5% и жить спокойно.