Что именно считает покрытие кода

Показатель покрытия обычно отвечает на простой вопрос: какая доля строк или ветвей программы была выполнена во время тестов? Если тест хотя бы раз прошёл по строке, отчёт может отметить её как покрытую. Но он не сообщает, проверил ли тест результат этой строки и заметил бы ошибку.

Представим функцию, которая рассчитывает скидку. Тест вызывает её и тем самым выполняет код расчёта, но не сравнивает полученную сумму с ожидаемой. Покрытие растёт, хотя неправильную скидку тест пропустит. Даже проверка результата может быть слабой: например, тест убеждается лишь, что функция вернула число, а не что скидка рассчитана верно.

Почему зелёный отчёт обнадёживает

Высокий процент создаёт впечатление, будто программа тщательно проверена. Однако он измеряет присутствие тестов рядом с кодом, а не их способность отличать правильное поведение от неправильного. Тест может пройти по обеим ветвям условия, но ничего не проверить внутри них. Или проверять только обычный случай, оставляя без внимания граничные значения и ошибки.

Это не делает покрытие бесполезным. Оно помогает находить участки, до которых тесты вообще не добираются, и видеть, какие изменения остались без проверки. Но процент сам по себе — карта посещённых мест, а не оценка надёжности.

Как проверить, что тест действительно защищает

Полезный вопрос — что произойдёт, если внести ошибку? Если заменить знак сравнения, убрать проверку или изменить расчёт, должен ли тест упасть? Такой мысленный эксперимент показывает, проверяет ли тест важное поведение или лишь запускает код.

Поэтому отчёт о покрытии стоит читать вместе с содержимым тестов: искать конкретные утверждения о результате, отказе или побочном эффекте. Значимо не то, сколько кода тесты посетили, а какую ошибку они способны обнаружить.