Запуск из npm scripts

Karma является мощным тестовым раннером для JavaScript, обеспечивающим автоматический запуск тестов в реальных браузерах. На практике часто используется интеграция Karma с npm scripts, что позволяет управлять тестированием через стандартные команды npm run, без необходимости ручного запуска Karma из командной строки. Такой подход упрощает интеграцию в процессы сборки и CI/CD.

Установка и базовая конфигурация

Для начала необходимо установить Karma и необходимые плагины через npm:

npm install --save-dev karma karma-cli karma-jasmine jasmine-core

karma-cli обеспечивает глобальный интерфейс запуска Karma, karma-jasmine интегрирует фреймворк Jasmine для написания тестов, а jasmine-core предоставляет реализацию самого фреймворка.

Файл конфигурации karma.conf.js создается с помощью команды:

npx karma init

При инициализации задаются следующие параметры:

  • Фреймворк тестирования (например, Jasmine, Mocha)
  • Браузеры, в которых будут выполняться тесты
  • Файлы, включаемые в тестовый запуск
  • Отчётчики (reporters) для отображения результатов тестов

Пример минимальной конфигурации:

module.exports = function(config) {
  config.set({
    frameworks: ['jasmine'],
    files: [
      'src/**/*.js',
      'test/**/*.spec.js'
    ],
    browsers: ['ChromeHeadless'],
    singleRun: true,
    reporters: ['progress']
  });
};

Определение npm scripts

После настройки karma.conf.js интеграция с npm scripts сводится к добавлению команд в раздел scripts файла package.json:

{
  "scripts": {
    "test": "karma start karma.conf.js",
    "test:watch": "karma start karma.conf.js --auto-watch --no-single-run",
    "test:ci": "karma start karma.conf.js --browsers ChromeHeadless --single-run"
  }
}

Разбор ключевых команд:

  • test: базовый запуск тестов один раз. Используется для локального тестирования без режима наблюдения.
  • test:watch: включает auto-watch, что позволяет Karma автоматически запускать тесты при изменении файлов. Параметр --no-single-run необходим для непрерывного режима.
  • test:ci: предназначен для запуска в CI/CD средах. Используется headless-браузер и опция singleRun: true, чтобы тесты завершались автоматически после выполнения.

Особенности работы с headless-браузерами

Для автоматизации тестов на серверных системах или в CI окружении важно использовать headless-браузеры, такие как ChromeHeadless или FirefoxHeadless. Они работают без графического интерфейса, что ускоряет запуск и снижает нагрузку.

Пример расширенной конфигурации с headless-браузером и дополнительными опциями:

browsers: ['ChromeHeadless'],
customLaunchers: {
  ChromeHeadlessCustom: {
    base: 'ChromeHeadless',
    flags: ['--no-sandbox', '--disable-gpu']
  }
}

Флаг --no-sandbox часто необходим для корректного запуска в контейнеризированных средах, например Docker.

Использование environment variables в npm scripts

npm scripts позволяют динамически передавать параметры в Karma через переменные окружения. Например:

{
  "scripts": {
    "test:ci": "BROWSERS=ChromeHeadless karma start karma.conf.js --single-run"
  }
}

В конфигурации Karma можно затем использовать переменные окружения:

const browsers = process.env.BROWSERS ? process.env.BROWSERS.split(',') : ['Chrome'];
module.exports = function(config) {
  config.set({
    browsers,
    singleRun: true
  });
};

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

Интеграция с другими инструментами сборки

npm scripts с Karma легко комбинируются с Webpack, Babel или TypeScript. Например, если проект использует TypeScript, необходимо сначала компилировать код:

{
  "scripts": {
    "build": "tsc",
    "test": "npm run build && karma start karma.conf.js"
  }
}

Это гарантирует, что тесты всегда выполняются на актуальном скомпилированном коде.

Логирование и отчётность

Для более детального контроля над выводом тестов можно использовать дополнительные репортеры:

{
  "scripts": {
    "test:verbose": "karma start karma.conf.js --reporters progress,dots,junit"
  }
}

Подключение JUnit репортера позволяет экспортировать результаты тестов в XML для интеграции с CI инструментами, такими как Jenkins или GitLab CI.

Параллельный запуск тестов

Karma поддерживает параллельное выполнение через флаги конфигурации или плагины. Для npm scripts можно задать:

{
  "scripts": {
    "test:parallel": "karma start karma.conf.js --concurrency 3"
  }
}

Параметр --concurrency указывает, сколько браузеров одновременно может запускаться, ускоряя общий процесс тестирования на больших проектах.

Вывод ошибок и диагностика

Использование npm scripts упрощает локальную диагностику тестов. Команда:

npm run test -- --log-level debug

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


Такой подход к запуску Karma через npm scripts обеспечивает гибкость, совместимость с CI/CD и упрощает поддержку тестового окружения в больших JavaScript-проектах.