Karma — это тестовый раннер для JavaScript, который обеспечивает автоматическое выполнение тестов в различных браузерах и окружениях. Один из ключевых аспектов его использования — гибкая настройка конфигурации в зависимости от окружения. Это позволяет запускать одни и те же тесты в разных условиях, например, на локальной машине, в CI/CD пайплайне или при интеграции с внешними сервисами.
karma.conf.jsОсновной инструмент настройки Karma — это файл
karma.conf.js. Он экспортирует функцию или объект с
конфигурацией. Ключевым моментом является то, что конфигурация может
быть динамической, используя переменные окружения, что
позволяет менять поведение тестов без модификации самого файла.
Пример базового шаблона:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
preprocessors: {
'src/**/*.js': ['babel'],
'test/**/*.spec.js': ['babel']
},
reporters: ['progress'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
browsers: ['Chrome'],
singleRun: false,
concurrency: Infinity
});
};
Для изменения поведения Karma в зависимости от окружения часто
используют process.env. Пример:
const isCI = process.env.CI === 'true';
module.exports = function(config) {
config.set({
browsers: isCI ? ['ChromeHeadless'] : ['Chrome'],
singleRun: isCI,
reporters: isCI ? ['dots'] : ['progress'],
logLevel: isCI ? config.LOG_WARN : config.LOG_INFO
});
};
Пояснения:
browsers: в CI предпочтительно использовать безголовый
режим (ChromeHeadless), чтобы не требовать графического
интерфейса.singleRun: в CI тесты выполняются один раз, а локально
— в режиме watch.reporters: в CI удобно минимизировать вывод
(dots), локально — видеть прогресс.logLevel: снижает объем логов в автоматизированной
среде.Для более крупных проектов часто создают несколько отдельных файлов конфигурации, чтобы каждая среда имела собственные настройки:
karma.conf.js // базовая конфигурация
karma.conf.local.js // локальная разработка
karma.conf.ci.js // CI/CD
Пример подключения базовой конфигурации:
const baseConfig = require('./karma.conf');
module.exports = function(config) {
baseConfig(config);
if (process.env.CI === 'true') {
config.set({
browsers: ['ChromeHeadless'],
singleRun: true,
reporters: ['dots']
});
} else {
config.set({
browsers: ['Chrome'],
singleRun: false,
reporters: ['progress']
});
}
};
Такой подход позволяет не дублировать код и управлять только теми параметрами, которые отличаются.
Karma поддерживает плагины для транспиляции, покрытия кода и интеграции с CI. Конфигурацию этих плагинов также удобно делать через переменные окружения:
const coverageEnabled = process.env.COVERAGE === 'true';
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: ['src/**/*.js', 'test/**/*.spec.js'],
preprocessors: {
'src/**/*.js': ['babel']
},
reporters: coverageEnabled ? ['progress', 'coverage'] : ['progress'],
coverageReporter: {
type: 'lcov',
dir: 'coverage/'
}
});
};
Если COVERAGE=true, автоматически подключается генерация
отчета о покрытии кода.
Для сложных проектов, которые тестируются на множестве браузеров, можно использовать динамический выбор через массивы и фильтры:
const browsers = process.env.BROWSERS
? process.env.BROWSERS.split(',')
: ['Chrome', 'Firefox'];
module.exports = function(config) {
config.set({ browsers });
};
Пример запуска в CI:
BROWSERS=ChromeHeadless,FirefoxHeadless npm test
Такой способ делает конфигурацию максимально гибкой, не требуя изменения кода.
Karma поддерживает интеграцию с облачными тестовыми платформами (например, BrowserStack, Sauce Labs). В этом случае настройки обычно зависят от наличия определенных переменных окружения:
const useBrowserStack = process.env.BROWSERSTACK_USERNAME && process.env.BROWSERSTACK_ACCESS_KEY;
module.exports = function(config) {
if (useBrowserStack) {
config.set({
customLaunchers: {
bs_chrome: {
base: 'BrowserStack',
browser: 'chrome',
os: 'Windows',
os_version: '10'
}
},
browsers: ['bs_chrome']
});
}
};
Если переменные окружения не заданы, Karma автоматически использует локальные браузеры.
"scripts": {
"test": "karma start karma.conf.local.js",
"test:ci": "CI=true karma start karma.conf.js",
"test:coverage": "COVERAGE=true karma start karma.conf.js"
}
Этот подход обеспечивает полную гибкость и позволяет использовать один набор тестов в самых разных сценариях без изменения исходного кода тестов.