Формат конфигурации

Karma — это тестовый раннер для JavaScript, который позволяет запускать тесты в реальных браузерах и обеспечивает автоматизацию процесса тестирования. Основу работы Karma составляет конфигурационный файл, который задаёт все параметры запуска, подключения плагинов, браузеров и отчетности.


Основная структура конфигурационного файла

Конфигурационный файл обычно называется karma.conf.js и экспортирует функцию или объект с настройками. Простейший пример выглядит так:

module.exports = function(config) {
  config.set({
    // Базовый путь для поиска файлов
    basePath: '',

    // Фреймворки для тестирования
    frameworks: ['jasmine'],

    // Файлы для включения в тестовый процесс
    files: [
      'src/**/*.js',
      'test/**/*.spec.js'
    ],

    // Исключения из файлового поиска
    exclude: [
      'src/vendor/**'
    ],

    // Препроцессоры
    preprocessors: {
      'src/**/*.js': ['babel'],
      'test/**/*.spec.js': ['babel']
    },

    // Тестовые репортеры
    reporters: ['progress', 'coverage'],

    // Порты сервера
    port: 9876,

    // Включение цветного вывода
    colors: true,

    // Уровень логирования
    logLevel: config.LOG_INFO,

    // Автоматический запуск тестов при изменении файлов
    autoWatch: true,

    // Настройка браузеров
    browsers: ['Chrome', 'Firefox'],

    // Режим одного запуска
    singleRun: false,

    // Максимальное количество одновременных запусков
    concurrency: Infinity
  });
};

Каждое поле конфигурации отвечает за определённую функциональность Karma, и его настройка влияет на поведение тестового раннера.


Параметр basePath

basePath определяет корневую директорию проекта для поиска файлов, указанных в files и exclude. Это позволяет задавать относительные пути независимо от расположения конфигурационного файла. Обычно используется пустая строка '', если конфигурационный файл находится в корне проекта.


Фреймворки для тестирования

frameworks — это массив подключаемых библиотек тестирования. Наиболее часто используются:

  • jasmine — популярный BDD-фреймворк.
  • mocha — гибкий фреймворк с поддержкой TDD и BDD.
  • qunit — легковесный инструмент для модульного тестирования.

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


Управление файлами и исключениями

  • files — массив шаблонов файлов, которые будут загружены в браузер для тестирования. Можно использовать маски **/*.js.
  • exclude — массив путей, которые необходимо исключить. Это удобно для исключения сторонних библиотек или больших каталогов, не участвующих в тестах.

Препроцессоры

preprocessors позволяют обрабатывать файлы перед их запуском в браузере. Чаще всего используются:

  • babel — для трансформации современного JavaScript (ES6+) в совместимый ES5.
  • coverage — для подготовки данных о покрытии тестами.

Пример:

preprocessors: {
  'src/**/*.js': ['babel', 'coverage'],
  'test/**/*.spec.js': ['babel']
}

Репортеры

reporters отвечают за формат вывода результатов тестирования. Основные типы:

  • progress — вывод прогресса выполнения тестов.
  • dots — короткая точечная индикация прохождения тестов.
  • coverage — генерация отчётов о покрытии кода.
  • junit — формат для CI-систем, например Jenkins.

Каждый репортер может иметь свои настройки, определяемые через отдельные параметры конфигурации.


Сервер и логирование

  • port — порт веб-сервера Karma, который используется для связи с браузерами.

  • colors — включение цветного вывода в консоль.

  • logLevel — уровень логирования:

    • config.LOG_DISABLE — без вывода.
    • config.LOG_ERROR — только ошибки.
    • config.LOG_WARN — предупреждения и ошибки.
    • config.LOG_INFO — информационные сообщения.
    • config.LOG_DEBUG — подробный вывод для отладки.

Автослежение за изменениями

autoWatch: true позволяет Karma автоматически запускать тесты при изменении файлов, что ускоряет разработку. В связке с singleRun: false это превращает Karma в непрерывный тестовый сервер.


Настройка браузеров

browsers — массив браузеров для запуска тестов. Karma поддерживает:

  • Chrome, ChromeHeadless
  • Firefox, FirefoxHeadless
  • Safari, Edge
  • PhantomJS (устаревший)

Можно создавать кастомные запускатели через customLaunchers с дополнительными флагами, например для CI:

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

Режим одного запуска и параллельность

  • singleRun — определяет, завершает ли Karma работу после одного прогона тестов (true) или остаётся активным для наблюдения изменений (false).
  • concurrency — максимальное количество браузеров, которые могут запускаться одновременно. Значение Infinity разрешает любое количество.

Подключение плагинов

Все дополнительные возможности, такие как препроцессоры и репортеры, подключаются через массив plugins:

plugins: [
  'karma-jasmine',
  'karma-chrome-launcher',
  'karma-coverage',
  'karma-babel-preprocessor'
]

Если массив не указан, Karma попытается автоматически загрузить все установленные плагины, начинающиеся с karma-.


Динамическая конфигурация

Конфигурацию можно изменять программно, используя Jav * aScript:

module.exports = function(config) {
  const isCI = process.env.CI === 'true';

  config.set({
    browsers: isCI ? ['ChromeHeadlessNoSandbox'] : ['Chrome'],
    singleRun: isCI
  });
};

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


Основные принципы форматирования

  1. Каждый ключ конфигурации имеет определённый тип данных: строки, массивы или объекты.
  2. Структура должна быть логически последовательной, чтобы легко находить и изменять параметры.
  3. Использование комментариев для пояснения нестандартных настроек облегчает поддержку проекта.
  4. Маски файлов и исключений должны быть оптимизированы, чтобы тестовый процесс не затягивался.

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