Karma предоставляет возможность расширения стандартного процесса тестирования с помощью кастомных адаптеров, которые позволяют интегрировать тесты с различными средами выполнения и инструментами отчётности. Адаптеры делятся на два типа: браузерные и репортерные. Браузерные адаптеры обеспечивают связь между Karma и средой исполнения тестов (например, PhantomJS, Chrome, Firefox), а репортерные — формирование и вывод результатов тестирования.
Ключевой принцип работы адаптера заключается в подписке на события Karma и обработке этих событий в соответствии с логикой конкретной среды. Karma использует архитектуру на основе событий EventEmitter, что обеспечивает гибкость и возможность перехвата всех стадий тестирования.
Браузерный адаптер — это модуль, который подключается к Karma через
конфигурацию plugins. Основная задача такого адаптера —
корректная инициализация браузера и передача данных о тестах в
Karma-сервер.
Структура адаптера:
var myBrowserAdapter = {
name: 'launcher:MyBrowser',
create: function(baseBrowserDecorator, args, logger, emitter) {
var browser = baseBrowserDecorator(args);
var log = logger.create('my-browser');
browser.start = function(url) {
log.info('Запуск браузера с URL: ' + url);
// логика запуска браузера
};
browser.on('done', function(result) {
log.info('Тесты завершены');
emitter.emit('browser_complete', browser);
});
return browser;
}
};
Основные моменты:
baseBrowserDecorator предоставляет базовые методы для
управления браузером, включая запуск, перезапуск и завершение.logger позволяет вести детальный лог работы
адаптера.emitter.emit('browser_complete', browser) уведомляет
Karma о завершении тестирования в данном экземпляре браузера.Адаптер регистрируется в конфигурации Karma следующим образом:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
browsers: ['MyBrowser'],
plugins: [
'karma-jasmine',
myBrowserAdapter
]
});
};
Репортерные адаптеры формируют отчёты о тестировании. Karma предоставляет API для подписки на события:
browser_startbrowser_completespec_successspec_failurerun_completeПример кастомного репортера:
function MyReporter(baseReporterDecorator, formatError) {
baseReporterDecorator(this);
this.onRunSt art = function(browsers) {
console.log('Начало тестирования в браузерах:', browsers.map(b => b.name).join(', '));
};
this.onSpecCompl ete = function(browser, result) {
if (result.success) {
console.log(`✓ ${result.description}`);
} else {
console.error(`✗ ${result.description}`);
console.error(formatError(result.log.join('\n')));
}
};
this.onRunCompl ete = function(browsers, results) {
console.log(`Тестирование завершено. Пройдено: ${results.success}, Ошибок: ${results.failed}`);
};
}
MyReporter.$inject = ['baseReporterDecorator', 'formatError'];
module.exports = {
'reporter:my': ['type', MyReporter]
};
Особенности:
baseReporterDecorator обеспечивает совместимость с
существующей системой репортинга Karma.formatError позволяет красиво форматировать ошибки для
вывода в консоль.События Karma позволяют глубоко интегрироваться с тестовой средой:
browsers_ready — все браузеры
подключены, можно запускать тесты.browser_error — обработка сбоев
конкретного браузера.spec_complete — получение информации о
результатах конкретного теста, включая время выполнения и сообщения об
ошибках.run_complete — финальный сбор
статистики по всей сессии тестирования.Правильная обработка этих событий позволяет реализовать:
Кастомные адаптеры особенно полезны при интеграции с нестандартными средами:
Пример интеграции с облачным браузером:
browser.start = function(url) {
cloudService.launchBrowser(args, function(sessionId) {
log.info('Браузер запущен. Session ID: ' + sessionId);
emitter.emit('browser_ready', browser);
});
};
Такой подход позволяет использовать Karma не только для локального тестирования, но и для масштабируемых CI-процессов.
baseBrowserDecorator, baseReporterDecorator),
чтобы минимизировать дублирование кода.Кастомные адаптеры расширяют возможности Karma и делают её гибким инструментом для интеграции с любыми средами тестирования и системами отчётности. Они позволяют реализовать точный контроль за процессом тестирования, автоматизацию сложных сценариев и построение детализированных отчётов, что особенно важно в крупных проектах и CI/CD пайплайнах.