Code coverage

Кратко про тему, на которой иногда копья ломаем. Code coverage — штука, которую в 3/4 мест агрессивно игнорируют, а в другой 1/4 агрессивно используют. Равнодушные встречаются не так уж часто.

Вся фигня в том, что это количественная метрика, на такие у разработчиков аллергия ещё со времён попыток оценить работу через LOC (кто больше строчек написал, тот и победил). Доведённый до абсолюта CC звучит вот так:
У тебя код тестами покрыт?
Да.
А почему покрытие 53%?
Потому, что остальной код — это обёртки с сотней тупых get/set.
И что? У нас покрытие должно быть 100%!
Иди нафиг, я увольняюсь.
Расскажу байку из жизни. Контекст: Python, сервис с некоторым покрытием тестами и некоторой документацией, живёт в production не первый год. Нахожу багу. Исправляю. Вроде исправилось, ништяк. Выкатываю. Проходит совсем немного времени. Сервис падает. Как оказалось, фикс баги открыл доступ к куску коду, который пару лет (емнип) не исполнялся вообще. И если бы хоть раз выполнился, сразу упал бы, что и произошло, там явная ошибка категории «что будет, если у null вызвать метод». Не хватило всего одного однострочного тупого теста, чтобы избежать пятисотящего прода.
Так вот. В нынешних условиях главная и важнейшая роль code coverage — показать вам код, который НЕ покрыт тестами и, быть может, вообще никогда не дёргался. Это полезно и для самопроверки (а не забыл ли я MyCoreServiceTest написать). Полезно для сторонней проверки (а есть ли в our.core.service вообще тесты). Полезно для оценки покрытия тестами ветвлений в том, что вы всё-таки решили потестировать (внезапно один if оказался за кадром).
Давайте ещё раз, пока не кинулись сразу же закидывать тухлыми тапками. На практике code coverage НЕ о том, СКОЛЬКО у вас тестов, фиг с ним. Он о том, есть ли вообще у вас тесты в нужных местах, а в ряде случаев и про качество этих тестов. Всё.

Но это… Честно говоря, мне гораздо спокойнее рефакторить код, который таки покрыт этими самыми тупыми и нелюбимыми 100%. Вот просто спокойнее. Не надо думать о том, правильно ли N лет назад Вася Иванов решил исключить что-либо из тестирования. Не надо прикидывать, написал ли Иван Петров в прошлом году тесты для того кода, что месяц аврально вклеивал. Если 100%, так хоть как, хоть одним вызовом, но весь код отработал.

Добавить комментарий