Karma — это тестовый раннер для JavaScript, разработанный для запуска тестов в реальных браузерах и интеграции с современными фреймворками и сборщиками модулей. Одной из ключевых возможностей Karma является генерация отчетов о покрытии кода, что позволяет оценивать качество тестирования и выявлять непроверенные участки.
Для работы с покрытием необходимо установить следующие пакеты:
npm install --save-dev karma karma-coverage
karma — основной раннер для тестов.karma-coverage — плагин для генерации отчётов о
покрытии кода.Если используется сборщик модулей, например Webpack, необходимо также подключить загрузчики для инструментов покрытия:
npm install --save-dev karma-webpack babel-loader babel-plugin-istanbul
babel-plugin-istanbul интегрируется с Babel и позволяет
автоматически инструментировать исходный код для анализа покрытия.
Файл конфигурации karma.conf.js управляет запуском
тестов и генерацией отчетов. Основные настройки для покрытия:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'], // или 'mocha', 'qunit'
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
preprocessors: {
'src/**/*.js': ['coverage']
},
reporters: ['progress', 'coverage'],
coverageReporter: {
dir: 'coverage/',
reporters: [
{ type: 'html', subdir: 'html' },
{ type: 'lcov', subdir: '.' },
{ type: 'text-summary' }
]
},
browsers: ['ChromeHeadless'],
singleRun: true
});
};
Ключевые моменты:
preprocessors — указывает, какие файлы необходимо
инструментировать для анализа покрытия.reporters — перечисляет виды отчетов. Плагин
coverage позволяет генерировать HTML, LCOV и текстовые
отчеты.browsers — для CI/CD рекомендуется использовать
безголовые браузеры (ChromeHeadless или
FirefoxHeadless).Пример текста текстового отчета:
Statements : 85% ( 34/40 )
Branches : 80% ( 16/20 )
Functions : 90% ( 9/10 )
Lines : 87% ( 33/38 )
Для проектов с современным JavaScript необходимо инструментировать
код через Babel. В .babelrc добавляется плагин:
{
"presets": ["@babel/preset-env"],
"env": {
"test": {
"plugins": ["istanbul"]
}
}
}
istanbul автоматически добавляет счетчики в код
для анализа покрытия.test позволяет инструментировать код только при
запуске тестов, не влияя на сборку для продакшена.Иногда необходимо исключить из анализа тестовые файлы или сторонние
библиотеки. В karma.conf.js можно настроить
preprocessors и coverageReporter следующим
образом:
preprocessors: {
'src/**/*.js': ['coverage'],
'src/vendor/**/*.js': []
},
coverageReporter: {
dir: 'coverage/',
includeAllSources: true
}
includeAllSources: true гарантирует, что отчет будет
включать все исходные файлы, даже если они не покрыты тестами.if, switch и логических
операторов.karma --single-run и проверять
coverage/html/index.html для выявления непокрытых
участков.Karma с покрытием легко интегрируется в CI-системы:
- name: Run tests with coverage
run: npx karma start karma.conf.js
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
files: coverage/lcov.info
Эта практика обеспечивает контроль качества кода и предупреждает снижение тестового покрытия при внесении новых изменений.
Для строгого контроля качества можно задать минимальные пороги в
конфигурации karma-coverage:
coverageReporter: {
check: {
global: {
statements: 80,
branches: 75,
functions: 85,
lines: 80
},
each: {
statements: 70,
branches: 65,
functions: 70,
lines: 70
}
}
}
global — порог для всего проекта.each — порог для каждого отдельного файла.Karma в сочетании с karma-coverage и Babel
позволяет:
Постоянная практика анализа покрытия кода и настройка строгих порогов создаёт дисциплину тестирования и улучшает стабильность проекта.