Общие проблемы и решения

Karma — это тестовый раннер для JavaScript, предназначенный для автоматического запуска тестов в реальных браузерах. Для работы требуется Node.js и пакетный менеджер npm. Установка выполняется через команду:

npm install --save-dev karma karma-cli

После установки Karma необходимо создать конфигурационный файл karma.conf.js:

npx karma init

Файл конфигурации содержит основные настройки: браузеры, фреймворк тестирования, пути к файлам и репортеры. Пример минимальной конфигурации для Jasmine и Chrome:

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

Ключевой момент: singleRun определяет, будет ли Karma запускать тесты один раз или оставаться в режиме наблюдения (watch mode).


Проблема: тесты не запускаются в браузере

Симптомы: после команды npx karma start в консоли виден прогресс, но окно браузера не открывается или тесты зависают.

Возможные причины и решения:

  1. Браузер не установлен Karma не запускает браузер, если он отсутствует или не доступен через PATH. Решение: установить соответствующий браузер или указать путь к нему в конфигурации:

    browsers: ['ChromeHeadless']
  2. Несовместимые версии плагинов Плагины Karma (например, karma-chrome-launcher) должны совпадать с версией Karma и Node.js. Решение: обновить все плагины до актуальных версий:

    npm install --save-dev karma-chrome-launcher@latest karma-jasmine@latest
  3. Блокировка браузера антивирусом или политикой ОС Иногда автоматическое открытие браузера запрещено. Решение: использовать headless-режим или запускать Karma от администратора.


Проблема: тесты выполняются слишком медленно

Причины:

  • Большое количество тестов с множественными зависимостями.
  • Использование реальных браузеров вместо headless.
  • Логирование всех шагов тестов на консоль.

Решения:

  • Переключение на headless-режим браузера:

    browsers: ['ChromeHeadless']
  • Ограничение параллельного запуска:

    concurrency: 2
  • Использование минимального репортера, например 'dots' вместо 'progress'.


Проблема: Karma не видит тестовые файлы

Симптомы: сообщение вроде No tests found.

Причины:

  • Неправильные пути в конфигурации.
  • Игнорирование файлов .spec.js или .test.js.

Решение: убедиться, что glob-паттерны корректны:

files: [
  'src/**/*.js',
  'test/**/*.spec.js'
],
exclude: [
  'node_modules/**'
]

Важно: порядок подключения файлов имеет значение. Если тесты зависят от библиотек, они должны идти первыми.


Проблема: ошибки типа ReferenceError или Module not found

Причины:

  • Несоответствие модульной системы (CommonJS vs ES Modules).
  • Karma не транспилирует современные JS-фичи, например import/export.

Решения:

  1. Использовать karma-webpack для обработки модулей:

    preprocessors: {
      'src/**/*.js': ['webpack'],
      'test/**/*.spec.js': ['webpack']
    }
  2. Настроить Babel:

    module: {
      rules: [
        {
          test: /\.js$/,
          exclude: /node_modules/,
          use: {
            loader: 'babel-loader',
            options: { presets: ['@babel/preset-env'] }
          }
        }
      ]
    }

Проблема: нестабильные или “флейки” тесты

Симптомы: один и тот же тест проходит иногда, а иногда падает.

Причины:

  • Асинхронные операции не дожидаются завершения.
  • Использование глобальных переменных между тестами.
  • Зависимость от таймеров или случайных значений.

Решения:

  • Использовать done callback или async/await для асинхронных тестов:

    it('должен завершить асинхронную операцию', async () => {
      const result = await fetchData();
      expect(result).toBeDefined();
    });
  • Изолировать состояния между тестами с помощью beforeEach и afterEach.

  • Заменять случайные значения моками или фикстурами.


Логирование и дебаг

Для детального анализа проблем полезно включать логирование Karma:

logLevel: config.LOG_DEBUG

Это позволяет видеть все шаги загрузки файлов, подключения плагинов и запуска тестов. Также полезно использовать браузерные devtools для headless-браузеров через karma-chrome-launcher с флагом:

customLaunchers: {
  ChromeDebugging: {
    base: 'Chrome',
    flags: ['--remote-debugging-port=9222']
  }
}

Проблема: интеграция с CI/CD

При запуске на сервере возникают ошибки с браузером или графическим интерфейсом.

Решения:

  • Всегда использовать headless-браузеры (ChromeHeadless, FirefoxHeadless).
  • Настроить CI так, чтобы устанавливались все зависимости и шрифты для браузеров.
  • Убедиться, что singleRun: true включен, чтобы Karma завершала работу после тестов.
singleRun: true,
browsers: ['ChromeHeadless']

Поддержка старых браузеров

Если требуется тестирование на IE или старых версиях Firefox:

  • Подключать соответствующие launchers: karma-ie-launcher, karma-firefox-launcher.
  • Использовать транспайлеры (Babel) для конвертации современного кода в ES5.
  • Оборачивать промисы и асинхронные функции в полифиллы.

Плагины и расширения

Karma поддерживает обширную экосистему плагинов:

  • karma-coverage — отчёт о покрытии тестов.
  • karma-junit-reporter — генерация отчетов для CI.
  • karma-phantomjs-launcher — headless PhantomJS (устаревший).
  • karma-typescript — поддержка TypeScript без внешней сборки.

Правильная комбинация плагинов решает большинство проблем с совместимостью и производительностью.