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
в консоли виден прогресс, но окно браузера не открывается или тесты
зависают.
Возможные причины и решения:
Браузер не установлен Karma не запускает браузер, если он отсутствует или не доступен через PATH. Решение: установить соответствующий браузер или указать путь к нему в конфигурации:
browsers: ['ChromeHeadless']Несовместимые версии плагинов Плагины Karma
(например, karma-chrome-launcher) должны совпадать с
версией Karma и Node.js. Решение: обновить все плагины
до актуальных версий:
npm install --save-dev karma-chrome-launcher@latest karma-jasmine@latestБлокировка браузера антивирусом или политикой ОС Иногда автоматическое открытие браузера запрещено. Решение: использовать headless-режим или запускать Karma от администратора.
Причины:
Решения:
Переключение на headless-режим браузера:
browsers: ['ChromeHeadless']Ограничение параллельного запуска:
concurrency: 2Использование минимального репортера, например
'dots' вместо 'progress'.
Симптомы: сообщение вроде
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).import/export.Решения:
Использовать karma-webpack для обработки
модулей:
preprocessors: {
'src/**/*.js': ['webpack'],
'test/**/*.spec.js': ['webpack']
}Настроить 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']
}
}
При запуске на сервере возникают ошибки с браузером или графическим интерфейсом.
Решения:
ChromeHeadless,
FirefoxHeadless).singleRun: true включен, чтобы Karma
завершала работу после тестов.singleRun: true,
browsers: ['ChromeHeadless']
Если требуется тестирование на IE или старых версиях Firefox:
karma-ie-launcher,
karma-firefox-launcher.Karma поддерживает обширную экосистему плагинов:
karma-coverage — отчёт о покрытии тестов.karma-junit-reporter — генерация отчетов для CI.karma-phantomjs-launcher — headless PhantomJS
(устаревший).karma-typescript — поддержка TypeScript без внешней
сборки.Правильная комбинация плагинов решает большинство проблем с совместимостью и производительностью.