Экспорт функции конфигурации

В 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));
};

Такой подход позволяет:

  • Разделять конфигурацию на базовую и специфичную для проекта.
  • Избегать дублирования настроек.
  • Легко управлять разными профилями тестирования (unit, integration, e2e).

Подключение плагинов

Экспорт функции удобен для динамического подключения плагинов в зависимости от нужд тестирования:

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
  });
};

Это позволяет гибко добавлять инструменты анализа покрытия кода, не изменяя базовую конфигурацию.

Преимущества использования функции конфигурации

  1. Динамичность — конфигурация может зависеть от переменных среды, командной строки или других условий.
  2. Масштабируемость — легко интегрировать разные профили тестирования и расширять существующие настройки.
  3. Модульность — поддержка импорта базовых конфигураций и их расширение.
  4. Гибкость плагинов — возможность подключать только нужные плагины под конкретный сценарий.

Рекомендации по организации

  • Разделять базовую и пользовательскую конфигурацию.
  • Использовать переменные окружения для переключения режимов.
  • Минимизировать дублирование настроек через Object.assign или spread-оператор { ...baseConfig, ...customConfig }.
  • Сохранять читаемость функции конфигурации, избегая слишком длинных вложенных условий.

Функция конфигурации — это ядро гибкой настройки Karma, которое позволяет создавать адаптивное тестовое окружение, легко интегрируемое как в локальные разработки, так и в CI/CD пайплайны.