Karma — это тестовый раннер для JavaScript, предназначенный для автоматического запуска тестов в различных браузерах. Основная цель Karma — облегчить процесс тестирования, предоставляя инфраструктуру, которая позволяет выполнять тесты на реальных движках браузеров, а не только в среде Node.js.
Karma тесно интегрируется с популярными фреймворками тестирования, такими как Jasmine, Mocha и QUnit, а также с инструментами сборки вроде Webpack или Gulp. Такой подход обеспечивает гибкость и удобство при организации тестового процесса.
Конфигурация Karma задается в файле karma.conf.js,
который содержит ключевые параметры:
['jasmine'] или ['mocha'].progress, dots, kjhtml и др.Пример минимальной конфигурации:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
browsers: ['ChromeHeadless'],
reporters: ['progress'],
autoWatch: true,
singleRun: false
});
};
Karma поддерживает множество плагинов, которые расширяют функциональность. Launchers позволяют запускать тесты в различных браузерах, включая headless-режимы, что особенно удобно для CI/CD.
karma-chrome-launcher — запуск тестов в Chrome.karma-firefox-launcher — запуск тестов в Firefox.karma-safari-launcher — Safari на macOS.karma-edge-launcher — Microsoft Edge.Кроме того, можно использовать плагины для интеграции с фреймворками
тестирования (karma-jasmine, karma-mocha) или
для генерации отчетов (karma-coverage,
karma-junit-reporter).
Гибридное тестирование в контексте Karma подразумевает сочетание нескольких подходов:
Karma чаще всего используется для юнит- и интеграционного тестирования, но благодаря подключаемым launchers и headless-браузерам можно запускать E2E-тесты без полноценного фреймворка вроде Cypress или Selenium.
Преимущества гибридного подхода с Karma:
Покрытие кода измеряется с помощью плагина
karma-coverage. Он анализирует, какие участки кода были
вызваны тестами, и строит отчет.
Пример конфигурации для покрытия кода:
reporters: ['progress', 'coverage'],
preprocessors: {
'src/**/*.js': ['coverage']
},
coverageReporter: {
type: 'html',
dir: 'coverage/'
}
Отчеты могут быть в формате HTML, lcov или text-summary. В CI/CD
удобно использовать lcov для интеграции с сервисами анализа
покрытия кода.
JavaScript активно использует асинхронные операции, поэтому Karma предоставляет поддержку асинхронных тестов через промисы и async/await.
Пример с Jasmine:
it('должен корректно получить данные', async () => {
const data = await fetchData();
expect(data).toBeDefined();
});
Karma корректно обрабатывает завершение асинхронных тестов, обеспечивая правильный тайминг и предотвращая преждевременное завершение тестового цикла.
Для больших проектов Karma часто используется совместно с Webpack или Gulp:
Пример интеграции с Webpack:
preprocessors: {
'src/**/*.js': ['webpack'],
'test/**/*.spec.js': ['webpack']
},
webpack: {
mode: 'development',
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
}
}
autoWatch и singleRun в
зависимости от сценария: во время разработки — автоматический запуск,
для CI — однократный.Karma выступает как универсальный инструмент для тестирования JavaScript, обеспечивая стабильность и прозрачность процессов проверки кода в проектах любой сложности.