Node.js окружение

Karma — это тестовый раннер для JavaScript, который интегрируется с различными фреймворками тестирования (Jasmine, Mocha, QUnit) и позволяет запускать тесты в реальных браузерах. Он особенно полезен для проверки совместимости кода на разных движках и автоматизации CI/CD процессов.

Установка Karma

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

npm install karma --save-dev
npm install karma-cli --save-dev

После этого устанавливаются необходимые плагины для выбранного тестового фреймворка и браузеров:

npm install karma-jasmine karma-chrome-launcher karma-mocha --save-dev
  • karma-jasmine — адаптер для фреймворка Jasmine.
  • karma-mocha — адаптер для Mocha.
  • karma-chrome-launcher — позволяет запускать тесты в Chrome.

Инициализация конфигурации

Karma предоставляет CLI для генерации файла конфигурации karma.conf.js.

npx karma init

CLI задаст следующие ключевые параметры:

  • Тестовый фреймворк — Jasmine, Mocha, QUnit.
  • Браузеры для запуска — Chrome, Firefox, Safari, PhantomJS.
  • Файлы для тестирования — паттерны для включения скриптов.
  • Отслеживание изменений — автообновление при изменении исходных файлов.

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

module.exports = function(config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine'],
    files: [
      'src/**/*.js',
      'test/**/*.spec.js'
    ],
    exclude: [],
    preprocessors: {},
    reporters: ['progress'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: false,
    concurrency: Infinity
  })
}

Основные опции конфигурации

  • frameworks — список фреймворков для тестирования. Можно подключать несколько.
  • files — паттерны файлов, которые будут загружены в браузер для тестирования.
  • preprocessors — позволяют интегрировать транспайлеры и сборщики, например, Babel или Webpack.
  • reporters — формат вывода результатов (progress, dots, mocha).
  • browsers — браузеры, в которых будут запускаться тесты.
  • autoWatch — если true, Karma будет отслеживать изменения файлов и автоматически перезапускать тесты.
  • singleRun — если true, тесты запускаются один раз и процесс завершается (удобно для CI).

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

Для современных приложений часто используется Webpack или Babel. Karma позволяет подключать препроцессоры:

preprocessors: {
  'src/**/*.js': ['webpack'],
  'test/**/*.spec.js': ['webpack']
},
webpack: {
  mode: 'development',
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  }
}

Такое подключение обеспечивает поддержку современных стандартов JavaScript, модулей ES6 и других возможностей, не поддерживаемых браузерами напрямую.

Запуск тестов

Karma может запускать тесты как в интерактивном режиме, так и в CI-процессах:

npx karma start
  • При autoWatch: true откроется браузер, тесты будут автоматически пересобираться и выполняться при изменении файлов.
  • При singleRun: true тесты выполняются один раз и выводятся в консоль, после чего процесс завершает работу.

Репортеры и вывод результатов

Karma поддерживает различные форматы отчетов о тестах:

  • progress — стандартный прогресс выполнения.
  • dots — точечное отображение каждого теста.
  • mocha — подробный формат с иерархией тестов и цветовой маркировкой.
  • junit — XML формат для интеграции с CI.

Пример подключения нескольких репортеров:

reporters: ['progress', 'mocha', 'junit'],
junitReporter: {
  outputDir: 'test-results',
  outputFile: 'results.xml',
  useBrowserName: false
}

Запуск в разных браузерах

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

browsers: ['Chrome', 'Firefox', 'Safari'],
customLaunchers: {
  ChromeHeadlessCI: {
    base: 'ChromeHeadless',
    flags: ['--no-sandbox', '--disable-gpu']
  }
}

Headless режим полезен для CI/CD, так как не требует визуального интерфейса браузера.

Интеграция с Continuous Integration

Karma отлично интегрируется с Jenkins, GitHub Actions, GitLab CI. Рекомендуется использовать singleRun: true и headless браузеры для корректной работы в серверной среде.

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

autoWatch: false,
singleRun: true,
browsers: ['ChromeHeadlessCI']

Такой подход обеспечивает воспроизводимость тестов, минимизирует зависимость от локальной среды разработчика и позволяет автоматически проверять код при каждом пуше.

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

  • Разделение исходного кода и тестов по директориям (src и test).
  • Использование именования файлов с суффиксом .spec.js или .test.js.
  • Подключение только необходимых файлов в karma.conf.js для уменьшения времени запуска.
  • Настройка препроцессоров для поддержки последних стандартов языка.
  • Использование headless браузеров для автоматических сборок и GUI-браузеров для локальной отладки.

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