Karma — это тестовый раннер для JavaScript, предназначенный для автоматизации запуска тестов в реальных браузерах. Основная цель — обеспечить надежное покрытие кода тестами при разработке как фронтенд, так и бэкенд-приложений на JavaScript.
Установка Karma осуществляется через npm:
npm install --save-dev karma karma-cli
После установки необходимо создать конфигурационный файл
karma.conf.js. Это можно сделать автоматически:
npx karma init
В процессе генерации конфигурации задаются следующие ключевые параметры:
Пример минимальной конфигурации:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
browsers: ['ChromeHeadless'],
reporters: ['progress'],
singleRun: true
});
};
Тесты в Karma структурируются по принципу модульности. Основные рекомендации:
имяМодуля.spec.js.describe и it, чтобы поддерживать читаемую
структуру:describe('MathUtils', () => {
it('должен правильно суммировать два числа', () => {
expect(sum(2, 3)).toBe(5);
});
it('должен возвращать 0 при сумме пустых аргументов', () => {
expect(sum()).toBe(0);
});
});
Ключевой момент: поддержание модульности облегчает отладку и рефакторинг тестов, а также снижает риск побочных эффектов при изменении кода.
Karma поддерживает запуск тестов в различных браузерах и платформах, включая headless-режимы. Это критично для непрерывной интеграции:
browsers: ['ChromeHeadless', 'FirefoxHeadless']
Для интеграции с CI/CD системами используется флаг
singleRun: true, что гарантирует завершение тестов после
одного прогонки и возврат корректного кода завершения.
Для анализа покрытия кода используется плагин
karma-coverage. Он позволяет получать отчеты в различных
форматах, включая HTML и LCOV:
reporters: ['progress', 'coverage'],
coverageReporter: {
type: 'html',
dir: 'coverage/'
}
Использование покрытия кода позволяет:
Karma легко интегрируется с современными сборщиками, такими как Webpack и Rollup, что позволяет тестировать ES6+ модули и TypeScript. Пример интеграции с Webpack:
preprocessors: {
'src/**/*.js': ['webpack'],
'test/**/*.spec.js': ['webpack']
},
webpack: {
mode: 'development',
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
}
}
Это обеспечивает единый процесс сборки кода и тестов, минимизируя расхождения между средой разработки и тестирования.
Karma поддерживает watch-mode, который автоматически перезапускает тесты при изменении файлов:
autoWatch: true
В связке с continuous testing в редакторе или CI это позволяет:
Karma обладает гибкой архитектурой и поддерживает большое количество плагинов:
karma-jasmine, karma-mocha — подключение
фреймворков тестированияkarma-chrome-launcher,
karma-firefox-launcher — запуск тестов в разных
браузерахkarma-coverage — сбор покрытия кодаkarma-webpack — интеграция с WebpackИспользование плагинов позволяет адаптировать среду тестирования под требования конкретного проекта и обеспечивать долговременную поддерживаемость тестовой инфраструктуры.
karma.conf.js для нескольких пакетов, с возможностью
расширения через karma.conf.base.js.Такой подход обеспечивает масштабируемость и устойчивость тестового окружения, позволяя поддерживать большие кодовые базы без потери качества тестов и эффективности разработки.