Karma — это тестовый раннер для JavaScript, который обеспечивает автоматическое выполнение тестов в реальных браузерах. Одной из мощных возможностей Karma является динамическая конфигурация, позволяющая изменять поведение тестов в зависимости от среды, параметров запуска или внешних условий.
Конфигурация Karma хранится в файле karma.conf.js,
который экспортирует объект с настройками. Базовая структура
включает:
module.exports = function(config) {
config.set({
basePath: '',
frameworks: ['jasmine'],
files: ['src/**/*.spec.js'],
browsers: ['ChromeHeadless'],
singleRun: true
});
};
Все ключи в объекте конфигурации могут быть заданы статически или с помощью вычисляемых значений, что открывает возможности для динамической настройки.
Файл karma.conf.js — это обычный модуль Node.js. Вместо
статического объекта можно использовать логику на Jav * aScript:
module.exports = function(config) {
const isCI = process.env.CI === 'true';
config.set({
basePath: '',
frameworks: ['mocha', 'chai'],
files: ['test/**/*.spec.js'],
browsers: isCI ? ['ChromeHeadless'] : ['Chrome', 'Firefox'],
singleRun: isCI,
reporters: isCI ? ['dots'] : ['progress', 'coverage']
});
};
В данном примере:
singleRun управляет поведением Karma для локальной
разработки и CI.Иногда требуется тестировать код с разными конфигурациями или под разные версии библиотек. Karma позволяет динамически формировать список файлов:
const testFiles = process.env.TEST_MODULES
? process.env.TEST_MODULES.split(',').map(m => `test/${m}.spec.js`)
: ['test/**/*.spec.js'];
module.exports = function(config) {
config.set({
files: testFiles
});
};
Такой подход полезен для модульного тестирования отдельных частей проекта без необходимости изменять основной файл конфигурации.
Karma поддерживает плагины, которые можно подключать динамически:
const plugins = ['karma-jasmine', 'karma-chrome-launcher'];
if (process.env.USE_COVERAGE === 'true') {
plugins.push('karma-coverage');
}
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
plugins: plugins,
reporters: process.env.USE_COVERAGE === 'true' ? ['progress', 'coverage'] : ['progress']
});
};
Динамическая активация плагинов позволяет включать или выключать функциональность тестирования без изменения кода тестов.
Karma предоставляет возможность передавать параметры через командную строку и использовать их для динамической конфигурации:
karma start --browsers=Firefox --single-run=false
В karma.conf.js доступ к параметрам осуществляется через
объект config:
module.exports = function(config) {
const customBrowsers = config.browsers || ['ChromeHeadless'];
config.set({
browsers: customBrowsers
});
};
Это позволяет создавать универсальные конфигурации, которые адаптируются под разные среды и требования.
Динамическая конфигурация облегчает интеграцию Karma с другими инструментами:
karma-webpack.karma-typescript в зависимости от версии TS или режима
компиляции.Пример с Webpack и условным подключением плагинов:
const webpackConfig = require('./webpack.test.config');
module.exports = function(config) {
const useCoverage = process.env.USE_COVERAGE === 'true';
config.set({
frameworks: ['jasmine'],
files: ['test/**/*.spec.ts'],
preprocessors: {
'test/**/*.spec.ts': ['webpack']
},
webpack: webpackConfig,
reporters: useCoverage ? ['progress', 'coverage'] : ['progress'],
coverageReporter: {
type: 'html',
dir: 'coverage/'
}
});
};
Динамическая конфигурация в Karma превращает обычный тестовый раннер в адаптивный инструмент, способный управлять сложными сценариями тестирования и интеграциями. Она позволяет строить эффективные пайплайны, минимизировать ручные настройки и обеспечивать стабильность тестов в любых условиях.