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. Например, можно создать версию для запуска 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 пайплайны.