Типы покрытия: lines, branches, functions, statements

Типы покрытия: lines, branches, functions, statements

Покрытие кода — это важный аспект тестирования, который позволяет определить, насколько хорошо тесты покрывают различные участки исходного кода. В Jest, как и в других инструментах тестирования, покрытие помогает разработчикам убедиться в том, что приложение работает корректно и что вся логика была протестирована. Jest поддерживает различные типы покрытия, которые дают более детальное представление о том, какие участки кода были проверены, а какие — нет. Рассмотрим основные типы покрытия, поддерживаемые Jest: lines, branches, functions, statements.

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

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

Для проверки покрытия строк в Jest используется параметр --coverage с ключом lines. Это позволяет получить отчет, который покажет процент строк, покрытых тестами.

Пример отчета:

Statements   : 90% (180/200)
Branches     : 80% (32/40)
Functions    : 85% (30/35)
Lines        : 85% (170/200)

В данном примере процент покрытия строк равен 85%, что означает, что из 200 строк кода 170 были выполнены в процессе тестирования.

Покрытие ветвей (branches)

Покрытие ветвей анализирует, насколько хорошо покрыты условные операторы (например, if, switch, тернарные операторы и т.д.). Каждый условный оператор имеет несколько возможных ветвей (например, if может быть либо истинным, либо ложным), и для каждого из этих вариантов нужно выполнить тест.

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

Пример:

function isPositive(number) {
  if (number > 0) {
    return true;
  }
  return false;
}

Чтобы покрытие ветвей было полным, нужно убедиться, что оба условия (number > 0 и number <= 0) были проверены. Если тесты будут только для положительных чисел, то покрытие ветвей будет неполным, так как не будет проверена ветка с number <= 0.

В Jest отчет о покрытии ветвей можно получить, добавив опцию branches. Этот тип покрытия часто помогает выявить участки кода, где логика условий может быть ошибочной или недотестированной.

Пример отчета:

Statements   : 90% (180/200)
Branches     : 85% (34/40)
Functions    : 85% (30/35)
Lines        : 85% (170/200)

Покрытие функций (functions)

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

Когда речь идет о покрытии функций, важно, чтобы тесты вызывали все функции, включая те, которые находятся в разных модулях, и те, которые могут быть условно вызваны (например, через колбэки или события). Это покрытие помогает удостовериться, что каждый метод или функция были протестированы хотя бы один раз.

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

Пример отчета:

Statements   : 90% (180/200)
Branches     : 80% (32/40)
Functions    : 90% (45/50)
Lines        : 85% (170/200)

Здесь покрытие функций составляет 90%, что означает, что 45 из 50 функций в коде были протестированы.

Покрытие операторов (statements)

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

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

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

Пример отчета:

Statements   : 95% (190/200)
Branches     : 85% (34/40)
Functions    : 85% (30/35)
Lines        : 90% (180/200)

Здесь можно увидеть, что 95% операторов были покрыты тестами, что указывает на хороший уровень тестирования на уровне операторов.

Итоги покрытия

Каждый тип покрытия дает разную информацию о качестве тестов и состоянии кода. Использование всех типов покрытия (lines, branches, functions, statements) помогает разработчику более детально понять, насколько тесты охватывают весь код, и какие участки могут быть недотестированы.

Покрытие строк и операторов — это базовые типы, которые показывают общую картину, в то время как покрытие ветвей и функций дает более детализированную информацию о логике работы программы и ее отдельных частей. В Jest настройка покрытия легко интегрируется с процессом тестирования, что делает его мощным инструментом для обеспечения качества кода.

Разработчики должны ориентироваться на все типы покрытия, чтобы избежать незамеченных ошибок и пробелов в тестировании.