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, и его настройка влияет на поведение тестового раннера.
basePathbasePath определяет корневую директорию проекта для
поиска файлов, указанных в 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, ChromeHeadlessFirefox, FirefoxHeadlessSafari, EdgePhantomJS (устаревший)Можно создавать кастомные запускатели через
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-процессы, позволяя автоматически переключать браузеры и режимы работы.
Формат конфигурации Karma является гибким и расширяемым инструментом, позволяющим детально настраивать тестирование как для локальной разработки, так и для интеграции в CI/CD. Правильная структура файла обеспечивает стабильность и предсказуемость работы тестового раннера, а также удобство масштабирования проекта.