Оценки качества тестов



Существует несколько проверок качества юнит тестов. Первая и самая распространенная — code coverage



⚪️Code Coverage: наиболее часто используемая метрика покрытия, также известная как test coverage. Эта метрика равна отношению количества строк кода, выполняемых по крайней мере одним тестом, к общему количеству строк в основном коде проекта.



🕹Code coverage (test coverage) = Количество выполненных строк кода / Общее количество строк кода





Покрытие в примере (см скрин 1) вычисляется легко. Общее количество строк в методе равно 5.  Количество строк, выполняемых в тесте, равно 4 — тест проходит все строки кода, кроме команды return true. Таким образом, покрытие равно 4/5 = 0,8 = 80 %.



Что будет, если отрефакторить этот метод и убрать избыточную команду if? Посмотрим скрин 2



Изменился ли процент покрытия? Да, изменился. Покрытие кода увеличилось до 100 %. Но улучшилось ли качество тестов с таким рефакторингом? Конечно же, нет. Тест по-прежнему проверяет то же количество ветвлений в коде. Этот простой пример показывает, как легко подтасовать процент покрытия. 



⚠️Процент покрытия служит хорошим негативным признаком, но плохим позитивным.



➡️🔀Branch coverage:



Другая метрика покрытия называется branch coverage (покрытием ветвей).



Branch coverage показывает более точные результаты, чем code coverage. Вместо того чтобы использовать количество строк кода, эта метрика смотрит на if и switch.



Branch coverage = Количество покрытых ветвей / Общее количество ветвей



Чтобы вычислить метрику branch coverage, необходимо подсчитать все возможные ветви (branches) в коде и посмотреть, сколько из них выполняются тестами. Вернемся к предыдущему примеру со строкой.



ℹ️ Метод IsStringLong содержит две ветви: одна для ситуации, в которой длина строкового аргумента превышает пять символов, и другая для строк, длина которых менее или равна 5 символам. Тест покрывает только одну из этих ветвей, поэтому метрика покрытия составляет 1/2 = 0,5 = 50 %.