Переменные окружения в конфигурации

В процессе тестирования JavaScript-приложений с помощью Karma часто возникает необходимость адаптировать конфигурацию под разные окружения: локальная разработка, CI/CD, продакшн-тестирование. Использование переменных окружения позволяет динамически менять параметры запуска, выбор браузеров, пути к файлам и уровни логирования без необходимости редактировать основной конфигурационный файл.

Настройка переменных окружения

Переменные окружения устанавливаются на уровне операционной системы или через инструменты запуска тестов. В Node.js доступ к ним осуществляется через объект process.env. Пример простого задания переменной:

export TEST_ENV=ci

или для Windows:

set TEST_ENV=ci

После этого в конфигурационном файле Karma можно использовать process.env.TEST_ENV для динамического изменения параметров:

module.exports = function(config) {
  const isCI = process.env.TEST_ENV === 'ci';

  config.set({
    basePath: '',
    frameworks: ['jasmine'],
    files: ['src/**/*.js', 'test/**/*.spec.js'],
    reporters: ['progress', isCI ? 'junit' : 'dots'],
    browsers: isCI ? ['ChromeHeadless'] : ['Chrome'],
    singleRun: isCI,
    concurrency: Infinity,
    logLevel: isCI ? config.LOG_WARN : config.LOG_INFO
  });
};

В этом примере изменяется репортер, выбор браузера, режим одиночного запуска и уровень логирования в зависимости от значения переменной TEST_ENV.

Использование .env файлов

Для удобства управления переменными окружения часто применяют .env файлы с последующей загрузкой через пакет dotenv.

Пример структуры .env файла:

TEST_ENV=ci
BROWSER=ChromeHeadless
LOG_LEVEL=warn

Загрузка этих переменных в конфигурацию Karma:

require('dotenv').config();

module.exports = function(config) {
  const browser = process.env.BROWSER || 'Chrome';
  const logLevel = process.env.LOG_LEVEL || 'info';

  config.set({
    frameworks: ['jasmine'],
    files: ['src/**/*.js', 'test/**/*.spec.js'],
    reporters: ['progress'],
    browsers: [browser],
    logLevel: config[`LOG_${logLevel.toUpperCase()}`],
    singleRun: process.env.TEST_ENV === 'ci'
  });
};

Такой подход позволяет централизованно управлять настройками для разных окружений без изменения кода конфигурации Karma.

Переменные для динамического управления плагинами

Karma поддерживает подключение различных плагинов, таких как karma-coverage, karma-junit-reporter и karma-sourcemap-loader. Их активация может зависеть от переменных окружения:

const useCoverage = process.env.USE_COVERAGE === 'true';

module.exports = function(config) {
  const plugins = [
    'karma-jasmine',
    'karma-chrome-launcher',
  ];

  if (useCoverage) {
    plugins.push('karma-coverage');
  }

  config.set({
    frameworks: ['jasmine'],
    files: ['src/**/*.js', 'test/**/*.spec.js'],
    reporters: ['progress'].concat(useCoverage ? ['coverage'] : []),
    plugins,
    preprocessors: useCoverage ? {
      'src/**/*.js': ['coverage']
    } : {},
    browsers: ['ChromeHeadless']
  });
};

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

Передача переменных через npm-скрипты

В package.json удобно задавать скрипты с передачей переменных окружения:

{
  "scripts": {
    "test:dev": "TEST_ENV=dev karma start",
    "test:ci": "TEST_ENV=ci karma start"
  }
}

На Windows с помощью cross-env:

{
  "scripts": {
    "test:ci": "cross-env TEST_ENV=ci karma start"
  }
}

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

Динамическая настройка путей и фильтров файлов

Переменные окружения полезны для изменения списка тестируемых файлов или исключений. Например:

const testPattern = process.env.TEST_PATTERN || 'test/**/*.spec.js';

module.exports = function(config) {
  config.set({
    files: [
      'src/**/*.js',
      testPattern
    ]
  });
};

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

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

  • Все переменные, влияющие на поведение тестов, лучше централизовать и документировать в .env или отдельном конфигурационном файле.
  • Для CI/CD использовать отдельные переменные окружения на сервере, чтобы не хранить чувствительные данные в репозитории.
  • Минимизировать жёсткую привязку к конкретным браузерам или репортерам, отдавая управление переменным окружением.
  • Использовать консистентное именование переменных: TEST_ENV, USE_COVERAGE, BROWSER, LOG_LEVEL — это облегчает понимание и поддержку.

Использование переменных окружения в конфигурации Karma делает тестовую среду гибкой, расширяемой и удобной для интеграции с различными процессами разработки и автоматизации.