Karma — это тестовый раннер для JavaScript, который позволяет запускать тесты в различных браузерах и автоматизировать процесс проверки кода. Одной из ключевых задач при тестировании является измерение покрытия кода, и для этого используется интеграция с Istanbul через плагин karma-coverage. Эта интеграция обеспечивает сбор метрик покрытия и позволяет визуализировать, какие участки кода протестированы, а какие нет.
Для работы с karma-coverage необходимо установить следующие пакеты через npm:
npm install --save-dev karma karma-jasmine karma-chrome-launcher karma-coverage jasmine-core
karma — основной тестовый раннер.karma-jasmine — адаптер для фреймворка Jasmine.karma-chrome-launcher — позволяет запускать тесты в
браузере Chrome.karma-coverage — плагин для интеграции с Istanbul и
генерации отчётов о покрытии.jasmine-core — фреймворк для написания тестов.После установки необходимо настроить karma.conf.js для использования плагина. Основные шаги:
Пример конфигурации:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
preprocessors: {
'src/**/*.js': ['coverage']
},
reporters: ['progress', 'coverage'],
coverageReporter: {
type: 'html', // тип отчёта: html, lcov, text-summary
dir: 'coverage/', // директория для отчётов
includeAllSources: true,
instrumenterOptions: {
istanbul: { noCompact: true }
}
},
browsers: ['ChromeHeadless'],
singleRun: true
});
};
Ключевые моменты:
preprocessors с ключом 'coverage'
указывает Karma использовать Istanbul для инструментирования исходного
кода перед запуском тестов.coverageReporter настраивает формат и расположение
отчётов. Часто используют html для визуального анализа и
text-summary для краткой консолидации.includeAllSources: true гарантирует, что покрытие будет
рассчитано даже для файлов, на которые нет прямых тестов.karma-coverage поддерживает несколько форматов:
Пример комбинирования форматов:
coverageReporter: {
dir: 'coverage/',
reporters: [
{ type: 'html', subdir: 'html' },
{ type: 'lcov', subdir: 'lcov' },
{ type: 'text-summary' }
]
}
Такой подход позволяет одновременно получать визуальные отчёты и интегрировать их с CI-системами.
Istanbul работает путём инструментирования исходного кода: он добавляет специальные счётчики перед каждой строкой, функцией или ветвлением кода. Karma с плагином karma-coverage автоматически применяет это инструментирование перед запуском тестов.
Важно: инструментировать следует только исходный
код, а не тесты. Поэтому в preprocessors нужно
указывать путь только к src/**/*.js.
Для автоматической проверки покрытия в CI/CD можно использовать lcov формат и инструменты вроде Codecov или Coveralls. Пример шагов для GitHub Actions:
- name: Run tests
run: npx karma start --single-run
- name: Upload coverage
uses: codecov/codecov-action@v3
with:
files: coverage/lcov/*.info
Это обеспечивает непрерывный контроль качества кода и позволяет автоматически отслеживать снижение покрытия после внесения изменений.
Для строгого контроля качества можно установить минимальные пороги покрытия, при которых сборка будет считаться успешной:
coverageReporter: {
dir: 'coverage/',
reporters: [{ type: 'lcov' }],
check: {
global: {
statements: 80,
branches: 70,
functions: 75,
lines: 80
}
}
}
Если покрытие падает ниже указанных процентов, Karma завершит работу с ошибкой, что предотвращает слияние непроверенного кода.
Для проектов на ES6+ или TypeScript необходимо использовать транспиляторы (Babel или TypeScript) перед инструментированием:
preprocessors: {
'src/**/*.js': ['babel', 'coverage']
},
babelPreprocessor: {
options: {
presets: ['@babel/preset-env']
}
}
Это гарантирует, что Istanbul сможет правильно анализировать синтаксис современных стандартов.
includeAllSources включён, чтобы
покрытие считалось корректно даже для неиспользуемого кода.ChromeHeadless) для
ускорения тестов и интеграции с CI.html, lcov)
для удобства визуального анализа и автоматизированной проверки.Эта схема позволяет построить надёжный процесс измерения покрытия, объединяя Karma и Istanbul через karma-coverage, и формирует основу для комплексного контроля качества JavaScript-проектов.