В процессе разработки тестов важно не только проверять корректность работы кода, но и следить за его покрытием тестами. Coverage — это метрика, показывающая, какую часть исходного кода покрывают тесты. Jest предоставляет мощные инструменты для конфигурирования покрытия тестами, позволяя настроить различные аспекты сбора и отображения этой информации. Настройка покрытия помогает обнаружить «слепые зоны» в проекте, повышая качество кода и уменьшая вероятность ошибок в будущем.
Чтобы включить сбор покрытия в Jest, необходимо использовать флаг
--coverage при запуске тестов. Это можно сделать как через
командную строку, так и в конфигурационном файле.
Пример запуска с командной строки:
jest --coverage
Если проект использует скрипты в package.json, то запуск
будет выглядеть следующим образом:
"scripts": {
"test": "jest --coverage"
}
Теперь при каждом запуске тестов Jest будет собирать информацию о покрытии кода и выводить её в консоль.
Для более гибкой настройки покрытия в Jest, можно использовать файл
конфигурации jest.config.js. В этом файле можно задать
различные параметры, такие как исключения файлов, пути для отчётов и
уровни покрытия.
Пример базовой конфигурации:
module.exports = {
collectCoverage: true, // Включение сбора покрытия
coverageDirectory: "coverage", // Папка для хранения отчётов
coverageProvider: "v8", // Использование движка для сбора покрытия (по умолчанию: v8)
collectCoverageFrom: [ // Указание файлов, для которых будет собираться покрытие
"src/**/*.js", // Все файлы JavaScript в папке src
"!src/**/*.test.js", // Исключение тестовых файлов
],
coverageThreshold: { // Минимальные значения покрытия для успешного теста
global: {
statements: 80, // Минимум 80% покрытия для всех операторов
branches: 70, // Минимум 70% покрытия для ветвлений
functions: 75, // Минимум 75% покрытия для функций
lines: 80, // Минимум 80% покрытия для строк кода
},
},
};
collectCoverageЭтот параметр включает или выключает сбор покрытия. Значение по
умолчанию — false. При установке в true Jest
будет собирать статистику покрытия для всех тестируемых файлов.
coverageDirectoryЗадаёт папку, в которой будут сохраняться отчёты о покрытии. По
умолчанию отчёты сохраняются в директории coverage в корне
проекта. Если необходимо изменить местоположение, достаточно указать
нужный путь.
coverageProviderJest поддерживает два разных движка для сбора покрытия:
v8 и babel. Использование v8
предпочтительнее, так как это встроенный движок, работающий быстрее и
точнее. Тем не менее, для проектов, использующих Babel, может быть
полезен движок babel.
collectCoverageFromЭтот параметр определяет, какие файлы будут участвовать в сборе покрытия. Можно указать массив с путями к файлам или использовать шаблоны для указания группы файлов. Например, можно исключить тесты или файлы с конфигурацией.
Примеры использования:
collectCoverageFrom: [
"src/**/*.js", // Все JavaScript файлы
"!src/**/*.test.js" // Исключаем тестовые файлы
]
coverageThresholdПозволяет установить минимальные требования по покрытию для каждого типа метрики (строки, операторы, функции, ветвления) как для глобального покрытия, так и для отдельных файлов. Если хотя бы один файл не соответствует этим пороговым значениям, Jest завершит тесты с ошибкой.
Пример:
coverageThreshold: {
global: {
statements: 80,
branches: 75,
functions: 70,
lines: 80,
},
}
Это заставит Jest выдать ошибку, если покрытие тестами будет ниже 80% по строкам или 70% по функциям для любого файла.
Jest поддерживает несколько форматов отчётов о покрытии, которые можно настроить в конфигурации. По умолчанию Jest генерирует отчёты в консоль в виде текста, но можно включить и другие форматы:
text — выводит информацию в консоль.lcov — генерирует отчет в формате lcov,
который можно просматривать в инструментах, таких как Codecov.json — выводит отчёт в формате JSON.clover — создаёт отчёт в формате Clover (используется в
некоторых CI-системах).html — генерирует отчёт в виде HTML, который можно
открыть в браузере для наглядного анализа покрытия.Для добавления дополнительных форматов отчётов в конфигурацию:
module.exports = {
coverageReporters: ["text", "lcov", "html"],
};
В процессе работы с Jest часто возникает необходимость исключить из покрытия определённые файлы или каталоги. Например, тестовые файлы или файлы, не содержащие логики (например, сгенерированные или служебные файлы).
Для этого используется параметр
coveragePathIgnorePatterns, в который можно передать
регулярные выражения для исключения файлов.
Пример:
module.exports = {
coveragePathIgnorePatterns: [
"/node_modules/", // Исключение всех файлов в node_modules
"/src/utils/" // Исключение всех файлов в папке utils
],
};
Для проектов, использующих CI/CD, важно не только собирать отчёты о
покрытии, но и интегрировать эти данные в систему непрерывной
интеграции. Jest предоставляет возможность автоматически генерировать
отчёты в формате lcov, которые могут быть загружены в
сервисы, такие как Codecov или Coveralls.
Для этого необходимо в конфигурации указать формат lcov
в качестве одного из отчётов и настроить CI-систему для загрузки этого
отчёта.
Пример конфигурации для CI:
module.exports = {
coverageReporters: ["lcov"],
};
После этого CI-система должна быть настроена на загрузку этого отчёта.
В проектах с несколькими окружениями, например, с разными настройками для разработки и продакшн, может понадобиться различное поведение покрытия для разных конфигураций.
Для этого можно использовать настройки Jest с условными операторами или параметрами командной строки. Например, можно отключить сбор покрытия в продакшн-окружении, чтобы не замедлять выполнение тестов:
module.exports = {
collectCoverage: process.env.NODE_ENV !== 'production', // Включение покрытия только в режиме разработки
};
Подключив и настроив конфигурацию покрытия в Jest, можно значительно повысить качество кода и уверенность в том, что система работает правильно на всех этапах разработки.