Кастомные лаунчеры

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

Принцип работы кастомного лаунчера

Кастомный лаунчер в Karma — это объект, который наследует базовый функционал стандартного лаунчера и реализует методы жизненного цикла браузера:

  • launch — вызывается для старта браузера. Должен инициировать процесс запуска и уведомить Karma о готовности к выполнению тестов через callback onStart.
  • kill — вызывается для завершения работы браузера. Должен корректно завершить процесс и вызвать onExit.
  • onBrowserProcessExit — обрабатывает неожиданное завершение процесса браузера и сообщает Karma об ошибках.

Пример базовой структуры кастомного лаунчера:

const { Launcher } = require('karma/lib/browser_launcher');

class MyCustomLauncher extends Launcher {
  constructor(id, emitter, injector) {
    super(id, emitter, injector);
  }

  _start(url) {
    const spawn = require('child_process').spawn;
    this._process = spawn('path/to/browser', [url]);
    this._process.on('exit', (code) => this._onProcessExit(code));
  }

  _kill() {
    if (this._process) {
      this._process.kill();
    }
  }

  _onProcessExit(code) {
    this._done(code === 0);
  }
}

module.exports = {
  'launcher:MyCustom': ['type', MyCustomLauncher]
};

Регистрация кастомного лаунчера

После создания класса лаунчера его необходимо зарегистрировать в конфигурации Karma через поле customLaunchers. Пример конфигурации:

module.exports = function(config) {
  config.set({
    frameworks: ['jasmine'],
    files: ['test/**/*.spec.js'],
    browsers: ['MyCustom'],
    customLaunchers: {
      MyCustom: {
        base: 'ChromeHeadless',
        flags: ['--disable-gpu', '--no-sandbox'],
        debug: false
      }
    }
  });
};

Ключевые моменты:

  • base — указывает на существующий лаунчер, от которого наследуются базовые методы.
  • flags — позволяет добавлять дополнительные параметры командной строки браузера.
  • debug — указывает, следует ли Karma выводить отладочную информацию о процессе запуска.

Настройка для CI/CD

Кастомные лаунчеры часто используют для автоматизации в CI/CD. Например, можно создать версию для запуска Chrome в Docker-контейнере:

customLaunchers: {
  ChromeDocker: {
    base: 'ChromeHeadless',
    flags: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--remote-debugging-port=9222'
    ]
  }
}

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

Динамическое создание лаунчеров

Karma поддерживает возможность динамического создания кастомных лаунчеров на основе условий окружения. Например, можно переключать параметры между локальным запуском и CI:

const isCI = process.env.CI === 'true';

module.exports = function(config) {
  config.set({
    browsers: [isCI ? 'ChromeDocker' : 'ChromeLocal'],
    customLaunchers: {
      ChromeLocal: {
        base: 'Chrome',
        flags: ['--disable-infobars']
      },
      ChromeDocker: {
        base: 'ChromeHeadless',
        flags: [
          '--no-sandbox',
          '--disable-setuid-sandbox'
        ]
      }
    }
  });
};

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

Отладка и расширение функциональности

Для сложных сценариев кастомный лаунчер может реализовывать:

  • Логирование всех аргументов запуска браузера.
  • Обработку нестандартных событий завершения процесса.
  • Автоматическое повторное подключение браузера при сбоях.

Метод _start(url) можно расширять, добавляя обработку stdout и stderr:

this._process.stdout.on('data', (data) => console.log(`[Browser stdout]: ${data}`));
this._process.stderr.on('data', (data) => console.error(`[Browser stderr]: ${data}`));

Интеграция с плагинами

Кастомные лаунчеры могут использоваться совместно с другими плагинами Karma, например для генерации отчетов или покрытия кода. Важно убедиться, что методы запуска и завершения корректно вызывают события onStart и onExit, чтобы остальные плагины получали уведомления о состоянии браузера.


Кастомные лаунчеры предоставляют гибкий инструмент для полного контроля над средой выполнения тестов. Они позволяют адаптировать Karma под любые нестандартные требования и интегрировать тестирование в сложные CI/CD пайплайны.