Karma — это инструмент для запуска тестов JavaScript в реальном
времени в браузерах. Его сила заключается в гибкой конфигурации,
позволяющей интегрировать различные фреймворки тестирования, трансляторы
кода и браузеры. Центральным элементом управления является файл
karma.conf.js, который экспортирует объект
конфигурации.
Ключевые поля конфигурации:
['jasmine'] или ['mocha']. Этот параметр
определяет, каким образом будут структурироваться тесты и какие функции
будут доступны.{'src/**/*.ts': ['typescript']}, а для покрытия кода —
{'src/**/*.js': ['coverage']}.['progress'], ['dots'],
['coverage'].Браузеры подключаются через browsers, где можно указать
как обычные браузеры (Chrome, Firefox), так и
их headless-версии (ChromeHeadless,
FirefoxHeadless). Для CI/CD рекомендуется использовать
headless-браузеры, так как они не требуют графического интерфейса и
быстрее стартуют.
Пример конфигурации для нескольких браузеров:
browsers: ['ChromeHeadless', 'FirefoxHeadless'],
singleRun: true,
autoWatch: false
true, Karma запускает
тесты один раз и завершает работу, что удобно для интеграции в CI.true, Karma
отслеживает изменения файлов и автоматически перезапускает тесты.Интеграция с инструментами покрытия (coverage) позволяет
анализировать, какие части кода не покрыты тестами. Обычно используется
пакет karma-coverage. Конфигурация выглядит так:
reporters: ['progress', 'coverage'],
coverageReporter: {
type: 'html',
dir: 'coverage/',
subdir: '.'
}
html,
lcov, text-summary).Для современных проектов часто используется транспиляция с помощью Babel, TypeScript или Webpack. Karma поддерживает эти процессы через preprocessors.
Пример интеграции с Babel:
preprocessors: {
'src/**/*.js': ['babel']
},
babelPreprocessor: {
options: {
presets: ['@babel/preset-env'],
sourceMap: 'inline'
}
}
Если проект использует модульную сборку через Webpack, Karma может
подключать karma-webpack для трансформации всех модулей
перед выполнением тестов.
Для крупных проектов важно минимизировать время выполнения тестов. Рекомендуется:
concurrency для параллельного запуска тестов
в нескольких браузерах:concurrency: Infinity
restartOnFileChange: true для ускоренного
перезапуска при локальной разработке.Karma имеет обширную экосистему плагинов, которые подключаются через поле plugins. Основные категории:
karma-jasmine,
karma-mocha.karma-chrome-launcher,
karma-firefox-launcher.karma-coverage,
karma-spec-reporter.karma-webpack,
karma-babel-preprocessor.Правильная настройка плагинов критична для стабильной работы. Неправильный порядок загрузки или несовместимые версии могут приводить к ошибкам, которые сложно диагностировать.
Для интеграции с CI/CD системами важно включать:
singleRun: true.logLevel: config.LOG_WARN),
чтобы не засорять вывод.Пример полной оптимизированной конфигурации:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
exclude: [],
preprocessors: {
'src/**/*.js': ['babel', 'coverage']
},
babelPreprocessor: {
options: {
presets: ['@babel/preset-env'],
sourceMap: 'inline'
}
},
reporters: ['progress', 'coverage'],
coverageReporter: {
type: 'html',
dir: 'coverage/',
subdir: '.'
},
browsers: ['ChromeHeadless', 'FirefoxHeadless'],
singleRun: true,
autoWatch: false,
concurrency: Infinity,
logLevel: config.LOG_WARN,
plugins: [
'karma-jasmine',
'karma-chrome-launcher',
'karma-firefox-launcher',
'karma-coverage',
'karma-babel-preprocessor'
]
});
};
Эта конфигурация сочетает универсальность и производительность, обеспечивая корректный запуск тестов в локальной и CI-среде, поддержку покрытия кода и современных стандартов JavaScript.