Порог покрытия (coverage threshold) в Mocha — это настройка, которая позволяет контролировать минимальный процент покрытия кода тестами, необходимый для успешного прохождения тестирования. Эта функция полезна для обеспечения качественного тестирования и предотвращения пропуска важных участков кода. Важно настроить правильный порог покрытия, чтобы тесты оставались эффективными и код не был лишён критической проверки.
Порог покрытия кода помогает:
Для настройки порога покрытия в Mocha обычно используется инструмент Istanbul, который анализирует покрытие кода, и его обёртка — NYC. Они предоставляют полную информацию о покрытии кода и позволяют задавать пороги, которые проверяются при запуске тестов.
Установка зависимостей
Для начала необходимо установить необходимые пакеты:
npm install --save-dev mocha nycКонфигурация в package.json
Настройка порога покрытия осуществляется через конфигурацию в файле
package.json. Для этого добавляется секция
nyc, где указывается минимальный процент покрытия для
разных типов покрытия (например, для строк, функций и линий).
Пример настройки:
{
"scripts": {
"test": "mocha"
},
"nyc": {
"all": true,
"check-coverage": true,
"branches": 90,
"functions": 95,
"lines": 98,
"statements": 95
}
}
В данном примере:
branches — минимальный порог покрытия
для ветвлений (ветвление кода).functions — минимальный порог покрытия
для функций.lines — минимальный порог покрытия для
строк.statements — минимальный порог
покрытия для операторов.Эти значения означают, что для успешного прохождения тестов необходимо обеспечить покрытие не менее 90% для ветвлений, 95% для функций, 98% для строк и 95% для операторов.
Параметры командной строки
NYC также позволяет передавать параметры через командную строку, что полезно для настройки порогов покрытия в различных сценариях. Например, можно задать порог только для строк:
nyc --lines 95 mochaИгнорирование файлов
Иногда необходимо исключить определённые файлы или директории из
подсчёта покрытия. Для этого можно использовать параметр
exclude в конфигурации:
{
"nyc": {
"exclude": [
"test/**",
"src/utils/**"
]
}
}
В данном случае тесты в папке test/ и утилиты в
src/utils/ не будут учитываться при подсчёте
покрытия.
После выполнения тестов, инструменты покрытия (например, NYC) анализируют результаты тестов и вычисляют процент покрытия для каждого типа — строк, функций, ветвлений и операторов. Затем они проверяют, соответствуют ли эти проценты заданным порогам. Если хотя бы один из порогов не выполнен, тесты завершатся с ошибкой.
Пример ошибки:
----------------------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Lines
----------------------------|---------|----------|---------|---------|-------------------
All files | 94.92 | 88.71 | 93.98 | 95.56 |
src/app.js | 85.56 | 73.14 | 88.57 | 89.23 | 45-56, 78-80
----------------------------|---------|----------|---------|---------|-------------------
Test failed: coverage threshold not met.
В этом примере видно, что порог покрытия для ветвлений
(% Branch) не был выполнен, так как минимальный порог был
установлен на 90%, а фактическое покрытие составило 88.71%.
Чтобы автоматически завершать тесты с ошибкой при несоответствии
порога, необходимо использовать флаг check-coverage. Он
заставит Mocha завершить выполнение тестов с кодом ошибки, если покрытие
не достигло минимального значения:
{
"nyc": {
"check-coverage": true,
"branches": 90,
"functions": 95,
"lines": 98,
"statements": 95
}
}
Если в процессе тестирования не будет выполнен хотя бы один из порогов, Mocha выведет сообщение об ошибке, и процесс завершится с ненулевым кодом возврата.
--branches, --functions, --lines
для тонкой настройкиЕсли проект использует специфические требования к покрытию для разных типов кода, можно использовать дополнительные флаги командной строки для настройки каждого из них:
nyc --branches 90 --functions 95 --lines 98 --statements 95 mocha
Эта команда позволит задать индивидуальные пороги для разных типов покрытия, что полезно в крупных проектах, где для разных типов кода могут быть разные требования.
Некоторые участки кода не всегда подходят для тестирования. Для таких случаев Mocha и NYC позволяют использовать комментарии для исключения частей кода из подсчёта покрытия.
Пример:
/* istanbul ignore next */
function nonTestableFunction() {
// Этот код не будет учитыватьсь в подсчете покрытия
}
Это позволяет избежать включения сложных или незначительных участков в отчёт о покрытии, сохраняя фокус на тестируемых частях программы.
Настройка порога покрытия является важной частью процесса интеграции
с системой CI/CD. Для этого необходимо добавить соответствующую
настройку в файл конфигурации CI (например, .gitlab-ci.yml,
.github/workflows и т.д.). Важно, чтобы порог покрытия был
проверен на каждом этапе тестирования, чтобы автоматически отклонять
запросы на слияние или деплой, если покрытие кода упало ниже
минимального порога.
Пример конфигурации для GitHub Actions:
name: Test and Coverage
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14'
- run: npm install
- run: npm test
Для интеграции с системой CI/CD нужно убедиться, что скрипты для тестирования и покрытия корректно выполняются, а также настраиваются оповещения при падении покрытия ниже допустимого уровня.
Умеренные пороги: Не стоит сразу устанавливать слишком высокие пороги покрытия (например, 100%), так как это может привести к фальшивым ошибкам в тестах, если какие-то участки кода по умолчанию не покрываются.
Регулярные ревизии: Важно регулярно проверять и корректировать пороги покрытия, чтобы они соответствовали реальным требованиям к проекту.
Покрытие критических участков: В первую очередь нужно устанавливать строгие пороги для ключевых и сложных частей кода, которые влияют на безопасность или функциональность системы.
Отслеживание изменений: Использование порогов покрытия помогает отслеживать изменения в тестировании при добавлении нового функционала.