Конфигурация на основе окружения

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 автоматически использует локальные браузеры.


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

  • Разделять базовую и специфичные конфигурации, используя модульный подход.
  • Использовать переменные окружения для переключения режимов работы: локально, CI, coverage, cloud.
  • Минимизировать дублирование настроек через функции и импорт базового файла.
  • Автоматизировать запуск с разными конфигурациями через npm-скрипты:
"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"
}

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