Karma — это тестовый раннер для JavaScript, который обеспечивает интеграцию с различными тестовыми фреймворками, включая Jasmine, Mocha, QUnit и другие. Основная мощь Karma заключается в возможности гибкой конфигурации для каждого фреймворка, что позволяет адаптировать процесс тестирования под конкретные требования проекта.
Karma использует параметр frameworks в конфигурационном
файле karma.conf.js для указания используемых тестовых
фреймворков. Этот параметр принимает массив строк, каждая из которых
соответствует установленному пакету тестового фреймворка.
Пример базовой конфигурации с Jasmine:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
browsers: ['Chrome'],
singleRun: true
});
};
Особенности:
karma-jasmine.При использовании Mocha необходимо учитывать конфигурацию интерфейса
и assertion-библиотеки. Karma поддерживает разные интерфейсы Mocha
(bdd, tdd, qunit) через параметр
client.mocha.
Пример конфигурации с Mocha и Chai:
module.exports = function(config) {
config.set({
frameworks: ['mocha', 'chai'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
client: {
mocha: {
ui: 'bdd',
timeout: 5000
}
},
browsers: ['ChromeHeadless'],
reporters: ['progress']
});
};
Ключевые моменты:
client.mocha.ui определяет стиль описания тестов
(describe/it для bdd,
suite/test для tdd).client.mocha.timeout задает максимальное время
выполнения теста, что особенно важно для асинхронных операций.karma-chai, что
позволяет использовать различные assertion-стили: expect,
should или assert.Каждый фреймворк может иметь собственные плагины Karma, которые расширяют возможности тестирования. Примеры таких плагинов:
karma-jasmine-html-reporter — визуальный HTML-репортер
для Jasmine.karma-mocha-reporter — удобный текстовый вывод для
Mocha.karma-phantomjs-launcher или
karma-chrome-launcher — запуск тестов в разных
браузерах.Плагины подключаются через параметр plugins или
автоматически, если они установлены через npm.
Пример расширенной конфигурации с плагинами:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: ['src/**/*.js', 'test/**/*.spec.js'],
reporters: ['progress', 'kjhtml'],
browsers: ['Chrome'],
plugins: [
'karma-jasmine',
'karma-chrome-launcher',
'karma-jasmine-html-reporter'
],
client: {
clearContext: false
}
});
};
Обратите внимание:
client.clearContext: false оставляет HTML-отчет Jasmine
видимым после запуска тестов.Фреймворки требуют специфической конфигурации для асинхронных тестов.
В Jasmine это достигается использованием done callback или
async/await. В Mocha необходимо настроить таймаут через
client.mocha.timeout для предотвращения ложных
срабатываний.
Пример конфигурации для асинхронных тестов в Mocha:
client: {
mocha: {
timeout: 10000
}
}
Для Jasmine асинхронность не требует изменений в конфиге, но полезно включать визуальный HTML-репортер для отслеживания длительных тестов.
Karma часто используется вместе с фреймворками, такими как Angular и React.
Angular:
@angular/cli, который
генерирует karma.conf.js.karma-jasmine и
karma-chrome-launcher.angular.json.React:
karma-webpack и
babel-loader.frameworks обычно включает Mocha/Chai или
Jasmine в зависимости от выбранного стиля тестирования.browsers в зависимости от среды CI/CD
(ChromeHeadless предпочтительнее для автоматизированных
сборок).singleRun: true для CI, и
autoWatch: true для локальной разработки.Эффективная конфигурация Karma с учетом особенностей фреймворков позволяет создавать стабильную, расширяемую среду тестирования, минимизируя ручные вмешательства и обеспечивая высокую воспроизводимость результатов.