Создание кастомных адаптеров

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_start
  • browser_complete
  • spec_success
  • spec_failure
  • run_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 — финальный сбор статистики по всей сессии тестирования.

Правильная обработка этих событий позволяет реализовать:

  • Логику перезапуска тестов при сбоях.
  • Интеграцию с CI/CD пайплайнами.
  • Кастомные форматы отчётов и уведомления.

Интеграция с внешними инструментами

Кастомные адаптеры особенно полезны при интеграции с нестандартными средами:

  • Встроенные браузеры для эмуляции мобильных устройств.
  • Облачные сервисы тестирования (BrowserStack, Sauce Labs) через кастомные лончеры.
  • Системы уведомлений и мониторинга, например Slack или Jira, через репортерные адаптеры.

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

browser.start = function(url) {
  cloudService.launchBrowser(args, function(sessionId) {
    log.info('Браузер запущен. Session ID: ' + sessionId);
    emitter.emit('browser_ready', browser);
  });
};

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


Рекомендации по разработке адаптеров

  • Сохранять совместимость с базовыми декораторами (baseBrowserDecorator, baseReporterDecorator), чтобы минимизировать дублирование кода.
  • Вести подробное логирование всех стадий запуска и завершения тестов.
  • Использовать асинхронные операции через промисы или колбэки для корректной работы с внешними сервисами.
  • Поддерживать корректное завершение процессов браузеров, чтобы избежать “зависших” тестовых сессий.
  • Проверять адаптер на разных версиях Karma и в различных браузерах, чтобы исключить нестабильное поведение.

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