Karma — гибкий тестовый раннер для JavaScript, который позволяет строить сложные системы тестирования с различными окружениями и настройками. Одним из ключевых инструментов для управления конфигурациями является наследование конфигураций, позволяющее создавать базовые шаблоны и расширять их под конкретные проекты или задачи.
Конфигурация Karma хранится в файле karma.conf.js. Она
представляет собой модуль, экспортирующий функцию, принимающую объект
config и вызывающую config.set({...}) с
набором параметров.
Пример минимальной конфигурации:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
browsers: ['Chrome'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
reporters: ['progress'],
singleRun: true
});
};
В этой конфигурации определены:
Базовая конфигурация подходит для небольших проектов, но при расширении потребностей приходится создавать повторяющиеся блоки для нескольких окружений. Здесь на помощь приходит наследование.
Наследование конфигураций в Karma реализуется через импорт базовой конфигурации и расширение её свойств. Поскольку конфигурация — это обычный JavaScript-модуль, можно использовать любые возможности языка: объекты, функции, деструктуризацию, spread-оператор.
Пример расширения базовой конфигурации:
const baseConfig = require('./karma.base.conf');
module.exports = function(config) {
const extendedConfig = {
...baseConfig,
browsers: ['ChromeHeadless'],
reporters: ['progress', 'coverage'],
coverageReporter: {
type: 'html',
dir: 'coverage/'
}
};
config.set(extendedConfig);
};
Ключевые моменты:
require('./karma.base.conf') импортирует базовую
конфигурацию;... позволяет скопировать все свойства
базового объекта;Иногда более удобным является функциональный паттерн, когда базовая конфигурация экспортирует функцию, принимающую дополнительные настройки:
// karma.base.conf.js
module.exports = function(options = {}) {
return {
frameworks: ['jasmine'],
browsers: ['Chrome'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
reporters: ['progress'],
...options
};
};
Расширение конфигурации в этом случае выглядит проще:
const baseConfig = require('./karma.base.conf');
module.exports = function(config) {
config.set(baseConfig({
browsers: ['Firefox'],
reporters: ['progress', 'coverage'],
coverageReporter: { type: 'lcov', dir: 'coverage/' }
}));
};
Преимущества:
В крупных проектах часто требуется запуск тестов в локальном режиме, на CI и в производственных сборках. Наследование конфигураций позволяет избежать дублирования:
karma.base.conf.js
karma.local.conf.js
karma.ci.conf.js
Пример karma.ci.conf.js:
const baseConfig = require('./karma.base.conf');
module.exports = function(config) {
config.set(baseConfig({
browsers: ['ChromeHeadless', 'FirefoxHeadless'],
reporters: ['dots', 'coverage'],
singleRun: true,
autoWatch: false
}));
};
Особенности:
autoWatch: false);Такой подход облегчает поддержку множества окружений и снижает риск ошибок при внесении изменений в базовую конфигурацию.
Для сложных проектов часто используется объединение нескольких конфигурационных модулей. Например, можно создать отдельные модули для файлов, браузеров и репортеров:
// karma.files.conf.js
module.exports = ['src/**/*.js', 'test/**/*.spec.js'];
// karma.browsers.conf.js
module.exports = ['Chrome', 'Firefox'];
// karma.conf.js
const files = require('./karma.files.conf');
const browsers = require('./karma.browsers.conf');
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files,
browsers,
reporters: ['progress'],
singleRun: true
});
};
Такое разделение позволяет:
Наследование конфигураций в Karma превращает набор тестов в гибкую и масштабируемую систему, позволяя управлять сложными проектами без дублирования кода и с максимальной читаемостью настроек.