Я случайно достиг 100% покрытия. Раньше у меня было 90%+ и я чувствовал себя довольно уверенно. Отчеты о покрытии дали мне полезную информацию о моей собственной кодовой базе, и я глубоко понял, что происходит и где.

Последнее утверждение было немного сложнее проверить, и я был уверен, что оно работает. Итак, я написал модульный тест только для того, чтобы научиться тестировать подобные вещи… и обнаружил ошибку.

Что значит иметь 100% тестовое покрытие

Я всегда думал, что речь идет о тестировании всех строк кода. Тем не менее, репортер приличного покрытия жалуется на пропущенные пути else, поэтому на самом деле он также включает код, которого там нет.

Более точным определением может быть то, что все ветви кода выполняются во время тестового запуска. Например: для каждого условия if должно быть как минимум два модульных теста (один для пункта if, один для пункта else).

Хорошо, что вам не нужны модульные тесты для 100% покрытия. Когда у вас есть сложный интеграционный тест, который охватывает все случаи, вы можете протестировать большую часть своего кода.

Стоит ли оно того?

Самый распространенный контраргумент состоит в том, что метрика сама по себе бесполезна, потому что одни тесты важнее других. Я согласен с тем, что некоторые части кода имеют решающее значение и должны быть протестированы больше, чем другие (эти части кодовой базы я обычно покрываю как минимум на 100%).

Дело в том, что само число не имеет значения. Покрытие тестами отличное, потому что оно помогает мне понять, как выполняется код. Это позволяет мне обнаруживать крайние случаи, о которых я не знаю.

Цель состоит не в том, чтобы иметь 100% охват, а в том, чтобы понять 100% кода и быть в курсе того, что там происходит. Полное покрытие кода — лишь побочный эффект такого подхода.