Karma — это тест-раннер для JavaScript, разработанный командой AngularJS, ориентированный на автоматизацию запуска тестов в реальных браузерах. Его ключевая цель — обеспечивать мгновенную обратную связь при разработке, позволяя запускать тесты при каждом изменении кода. Karma не выполняет сами тесты, а интегрируется с тестовыми фреймворками вроде Jasmine, Mocha, QUnit, обеспечивая их выполнение в различных браузерах.
Основные принципы работы Karma:
Karma устанавливается через npm:
npm install --save-dev karma karma-cli
Для интеграции с конкретным фреймворком тестирования и браузером устанавливаются дополнительные пакеты:
npm install --save-dev karma-jasmine jasmine-core karma-chrome-launcher
Конфигурация создается командой:
npx karma init
В результате создается файл karma.conf.js, в котором
настраиваются следующие ключевые параметры:
['jasmine'].dots, progress, junit).Пример минимальной конфигурации:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
browsers: ['ChromeHeadless'],
reporters: ['progress'],
autoWatch: true,
singleRun: false
});
};
Karma поддерживает большинство популярных тестовых фреймворков, таких как Jasmine, Mocha, QUnit. Выбор фреймворка определяет синтаксис тестов и подход к ассерциям. Пример простого Jasmine-теста:
describe('Math utility', function() {
it('должна корректно суммировать два числа', function() {
const sum = 2 + 3;
expect(sum).toBe(5);
});
});
Karma позволяет запускать этот тест в любом браузере из конфигурации, обеспечивая совместимость кода с разными движками.
Современные проекты используют Webpack или Browserify. Karma может интегрироваться с ними через специальные пре-процессоры:
preprocessors: {
'src/**/*.js': ['webpack'],
'test/**/*.spec.js': ['webpack']
}
Конфигурация Webpack указывается через karma-webpack,
что позволяет:
Karma поддерживает как графические, так и headless-браузеры. Headless-режим особенно полезен для CI/CD:
browsers: ['ChromeHeadless', 'FirefoxHeadless']
Для кастомных настроек можно создавать свои launchers:
customLaunchers: {
ChromeDebug: {
base: 'Chrome',
flags: ['--remote-debugging-port=9222']
}
}
Karma может выводить результаты тестов в разные форматы:
karma-coverage.Пример настройки покрытия:
reporters: ['progress', 'coverage'],
coverageReporter: {
type: 'html',
dir: 'coverage/'
}
autoWatch: true позволяет Karma следить за изменениями
файлов. При разработке это дает мгновенный фидбек:
singleRun: false создается непрерывная
среда тестирования.npx karma start с
autoWatch: true.singleRun: true и
headless-браузеры, интеграция с отчетами и покрытием.concurrency.Karma обладает гибкой системой плагинов:
Асинхронные тесты обрабатываются через done callback или
Promises:
it('асинхронный тест', function(done) {
setTimeout(function() {
expect(true).toBe(true);
done();
}, 100);
});
С использованием Promises:
it('Promise тест', function() {
return fetchData().then(data => {
expect(data).toBeDefined();
});
});
Karma корректно завершает выполнение теста только после завершения асинхронных операций.
Karma может работать совместно с Selenium Grid для распределенного тестирования в реальных браузерах на удаленных машинах:
karma-selenium-launcher или
кастомные launchers.Пример конфигурации для удаленного Chrome через Selenium:
customLaunchers: {
RemoteChrome: {
base: 'Selenium',
browserName: 'chrome',
seleniumAddress: 'http://localhost:4444/wd/hub'
}
},
browsers: ['RemoteChrome']
Karma получает результаты тестов и передает их обратно, а Selenium Grid управляет реальными экземплярами браузеров.
ChromeDebug или FirefoxDebug
для запуска браузера с отладочными инструментами.logLevel: config.LOG_DEBUG для подробного
вывода.karma-sourcemap-loader для отображения
исходных строк при использовании транспайлера.Karma сочетает в себе простоту настройки и мощь масштабируемого тестирования, позволяя создавать стабильные и надежные тестовые среды для современных JavaScript-приложений.