Karma — это тестовый раннер для JavaScript, предназначенный для запуска тестов в реальных браузерах или эмуляторах браузеров. Его ключевая цель — обеспечение надежной и быстрой обратной связи о состоянии кода, что особенно важно при разработке фронтенд-приложений и библиотек. Karma не выполняет тестирование сам по себе; он интегрируется с различными фреймворками для тестирования, такими как Jasmine, Mocha, QUnit и другими, и управляет их выполнением в разных средах.
Основные особенности Karma:
karma.conf.js.Установка Karma обычно происходит через npm. Для базовой установки достаточно нескольких пакетов:
npm install --save-dev karma karma-cli
После этого необходимо установить адаптеры для тестового фреймворка и браузеров. Например, для Jasmine и Chrome:
npm install --save-dev karma-jasmine karma-chrome-launcher jasmine-core
Создание конфигурационного файла происходит командой:
npx karma init
В процессе генерации можно задать следующие параметры:
Пример минимального файла karma.conf.js:
module.exports = function(config) {
config.set({
basePath: '',
frameworks: ['jasmine'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
exclude: [],
preprocessors: {},
reporters: ['progress'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false,
concurrency: Infinity
});
};
Ключевые моменты конфигурации:
files: определяет файлы, которые будут загружены в
браузер для тестирования.reporters: указывает формат вывода результатов тестов
(progress, dots, mocha и
другие).autoWatch: при true Karma автоматически
перезапускает тесты при изменении файлов.singleRun: если true, Karma выполнит тесты
один раз и завершит работу, что удобно для CI.Karma взаимодействует с браузерами через специальные launcher’ы. Для каждого браузера существует отдельный пакет:
karma-chrome-launcherkarma-firefox-launcherkarma-safari-launcherkarma-edge-launcherБраузеры могут запускаться в обычном или безголовом режиме (headless). Безголовый режим используется для CI/CD, поскольку не требует графического интерфейса.
Пример конфигурации Chrome в headless:
browsers: ['ChromeHeadless']
Можно настроить несколько браузеров одновременно:
browsers: ['Chrome', 'FirefoxHeadless']
Karma поддерживает множество тестовых фреймворков через адаптеры. Основные фреймворки:
Пример теста с Jasmine:
describe('Математические функции', () => {
it('должны корректно суммировать два числа', () => {
const sum = (a, b) => a + b;
expect(sum(2, 3)).toBe(5);
});
});
Karma загружает эти тесты в выбранные браузеры и возвращает результат выполнения через консоль или отчеты.
Karma поддерживает preprocessor’ы, позволяющие обрабатывать файлы перед запуском. Это необходимо для использования современных стандартов JavaScript, TypeScript или модульных систем:
karma-webpack — интеграция с Webpack, сборка модулей и
транспиляция ES6/TypeScript.karma-babel-preprocessor — транспиляция кода через
Babel.karma-coverage — генерация отчетов о покрытии кода
тестами.Пример конфигурации для TypeScript с Webpack:
preprocessors: {
'src/**/*.ts': ['webpack'],
'test/**/*.ts': ['webpack']
},
webpack: {
module: {
rules: [
{ test: /\.ts$/, use: 'ts-loader' }
]
},
resolve: { extensions: ['.ts', '.js'] }
}
Karma позволяет настраивать отчеты о выполнении тестов и покрытии кода. Основные reporter’ы:
progress — вывод текущего состояния тестов.dots — компактный вид отчета.mocha — подробный структурированный отчет.coverage — отчет о проценте покрытия кода тестами.Пример подключения покрытия кода через Istanbul:
reporters: ['progress', 'coverage'],
coverageReporter: {
type: 'html',
dir: 'coverage/'
}
После запуска Karma создаст папку coverage с
детализированным отчетом, включая процент покрытия по каждой функции и
файлу.
Karma легко интегрируется с системами непрерывной интеграции (Jenkins, GitHub Actions, GitLab CI). Основная конфигурация для CI:
Пример настройки для GitHub Actions:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 20
- run: npm install
- run: npx karma start --single-run
Karma предоставляет несколько уровней логирования:
config.LOG_DISABLE — без логов.config.LOG_ERROR — только ошибки.config.LOG_WARN — предупреждения и ошибки.config.LOG_INFO — стандартные сообщения.config.LOG_DEBUG — детальные сообщения для
отладки.При возникновении проблем с тестами важно включить
LOG_DEBUG, чтобы получить полную информацию о запуске,
загрузке файлов и состоянии браузеров.
Параметр autoWatch позволяет Karma отслеживать изменения
исходного кода и тестов. При изменении любого файла тесты
перезапускаются автоматически, что ускоряет цикл разработки и
отладки.
Для крупных проектов рекомендуется использовать совместно с Webpack watch mode, чтобы минимизировать время пересборки и запуска тестов.
Karma является ядром тестовой инфраструктуры для фронтенд-разработки, обеспечивая гибкость запуска тестов, интеграцию с разными фреймворками и браузерами, а также удобные инструменты для отчетности и покрытия кода.