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
При инициализации задаются следующие параметры:
Пример минимальной конфигурации:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
browsers: ['ChromeHeadless'],
singleRun: true,
reporters: ['progress']
});
};
После настройки 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,
чтобы тесты завершались автоматически после выполнения.Для автоматизации тестов на серверных системах или в CI окружении
важно использовать headless-браузеры, такие как
ChromeHeadless или FirefoxHeadless. Они
работают без графического интерфейса, что ускоряет запуск и снижает
нагрузку.
Пример расширенной конфигурации с headless-браузером и дополнительными опциями:
browsers: ['ChromeHeadless'],
customLaunchers: {
ChromeHeadlessCustom: {
base: 'ChromeHeadless',
flags: ['--no-sandbox', '--disable-gpu']
}
}
Флаг --no-sandbox часто необходим для корректного
запуска в контейнеризированных средах, например Docker.
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-проектах.