Инструментирование кода — процесс добавления в исходный код специальных точек слежения, которые позволяют измерять, какие части кода выполняются во время тестов. В контексте Karma это ключевой этап для получения метрик покрытия кода (code coverage) и анализа качества тестирования. Karma сама по себе является тестовым раннером и не предоставляет встроенных средств для инструментирования, поэтому обычно используется в сочетании с инструментами вроде Istanbul/nyc или плагинами типа karma-coverage.
Принцип действия: Инструментирование заключается
в автоматическом добавлении в код счётчиков, фиксирующих, какие строки,
функции и ветвления были выполнены. Например, каждый блок
if или функция оборачивается специальной логикой, которая
инкрементирует счётчик при её выполнении. В результате тесты запускаются
не просто на исходном коде, а на инструментированной версии, позволяющей
собрать детальные статистики.
Инструменты и плагины:
lcov, html, text-summary.Для включения инструментирования в Karma конфигурационный файл
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',
dir : 'coverage/',
includeAllSources: true
},
browsers: ['ChromeHeadless'],
singleRun: true
});
};
Ключевые моменты конфигурации:
preprocessors: указывает, какие файлы должны быть
инструментированы. Обычно это исходный код (src/**/*.js),
но не тесты.reporters: добавление coverage позволяет
Karma собирать и формировать отчёты по покрытию.coverageReporter: задаёт формат отчёта и директорию для
сохранения. Параметр includeAllSources: true гарантирует
учёт всех файлов, даже если для них нет тестов.Инструментирование позволяет анализировать разные аспекты покрытия:
if, switch)
были пройдены.Эти метрики позволяют оценить полноту тестов и выявлять участки кода, которые остаются без проверки.
Для проектов на современных стандартах JavaScript инструментирование обычно совмещается с транспиляцией:
babel-plugin-istanbul добавляет счётчики покрытия прямо при
транспиляции.// .babelrc
{
"env": {
"test": {
"plugins": ["istanbul"]
}
}
}
babel-loader для
трансформации кода и плагин istanbul-instrumenter-loader
для инструментирования:module.exports = {
module: {
rules: [
{
test: /\.js$/,
include: path.resolve('src/'),
loader: 'babel-loader'
},
{
test: /\.js$/,
include: path.resolve('src/'),
loader: 'istanbul-instrumenter-loader',
enforce: 'post'
}
]
}
};
sourceMap и
includeAllSources, чтобы отчёты покрытия точно совпадали с
исходными файлами, а не с транспилированным кодом.Инструментирование в Karma является центральным компонентом процесса анализа качества тестирования. Оно позволяет собирать детальные метрики покрытия, интегрируется с современными инструментами сборки и транспиляции, а также помогает поддерживать код в чистом и тестируемом состоянии.