В Karma конфигурация тестового окружения задается через специальный
файл karma.conf.js. Ключевой особенностью современного
подхода является экспорт функции конфигурации, а не
простого объекта. Это позволяет динамически формировать настройки в
зависимости от среды, параметров запуска или внешних условий.
Файл karma.conf.js обычно выглядит так:
module.exports = function(config) {
config.set({
basePath: '',
frameworks: ['jasmine'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
exclude: [],
preprocessors: {
'src/**/*.js': ['babel'],
'test/**/*.spec.js': ['babel']
},
reporters: ['progress'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['ChromeHeadless'],
singleRun: false,
concurrency: Infinity
});
};
Ключевые моменты:
module.exports = function(config) { ... } — экспорт
функции вместо объекта. Karma вызывает эту функцию, передавая объект
config.config.set({...}) — метод, который принимает объект с
полной конфигурацией тестового окружения.Экспорт функции позволяет изменять параметры конфигурации в зависимости от внешних условий. Например, выбор браузера в зависимости от среды:
module.exports = function(config) {
const isCI = process.env.CI === 'true';
config.set({
browsers: isCI ? ['ChromeHeadless'] : ['Chrome', 'Firefox'],
singleRun: isCI
});
};
Здесь используются:
process.env.CI — стандартная переменная окружения,
которая задается в системах CI/CD.singleRun включается в режиме CI, чтобы тесты
запускались один раз и завершались.Функция конфигурации позволяет импортировать и расширять внешние конфигурации, например, общий базовый файл настроек:
const baseConfig = require('./karma.base.conf');
module.exports = function(config) {
const customConfig = {
files: ['test/unit/**/*.spec.js'],
reporters: ['mocha']
};
config.set(Object.assign({}, baseConfig, customConfig));
};
Такой подход позволяет:
Экспорт функции удобен для динамического подключения плагинов в зависимости от нужд тестирования:
module.exports = function(config) {
const isCoverage = process.env.COVERAGE === 'true';
const plugins = [
'karma-jasmine',
'karma-chrome-launcher'
];
if (isCoverage) {
plugins.push('karma-coverage');
}
config.set({
frameworks: ['jasmine'],
files: ['src/**/*.js', 'test/**/*.spec.js'],
reporters: isCoverage ? ['progress', 'coverage'] : ['progress'],
plugins: plugins
});
};
Это позволяет гибко добавлять инструменты анализа покрытия кода, не изменяя базовую конфигурацию.
Object.assign или spread-оператор
{ ...baseConfig, ...customConfig }.Функция конфигурации — это ядро гибкой настройки Karma, которое позволяет создавать адаптивное тестовое окружение, легко интегрируемое как в локальные разработки, так и в CI/CD пайплайны.