Karma — это тест-раннер для JavaScript, обеспечивающий запуск тестов в реальных браузерах с возможностью интеграции с различными фреймворками тестирования, включая Jasmine. Для начала работы необходимо установить пакет Karma и соответствующие плагины:
npm install --save-dev karma karma-jasmine jasmine-core karma-chrome-launcher
После установки создается конфигурационный файл Karma:
npx karma init
В процессе инициализации выбирается фреймворк тестирования
(jasmine), браузеры для запуска тестов и файлы, которые
будут включены в тестовый пакет.
Файл karma.conf.js определяет ключевые аспекты работы
тест-раннера. Пример базовой конфигурации для Jasmine:
module.exports = function(config) {
config.set({
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
});
};
Ключевые моменты:
frameworks — указывает Jasmine как фреймворк для
тестов.files — список файлов, которые будут загружены в
браузер перед запуском тестов. Обычно это исходники и файлы с
тестами.reporters — формат вывода результатов (например,
progress, dots).browsers — браузеры для запуска тестов. Можно
использовать Chrome, Firefox или Headless-браузеры для CI/CD.autoWatch — если true, Karma автоматически
запускает тесты при изменении файлов.singleRun — режим однократного запуска (важно для
CI).Jasmine использует описательную структуру тестов через функции
describe и it.
describe('Функция суммирования', () => {
it('должна возвращать сумму двух чисел', () => {
const sum = (a, b) => a + b;
expect(sum(2, 3)).toBe(5);
});
it('должна корректно работать с отрицательными числами', () => {
const sum = (a, b) => a + b;
expect(sum(-1, -4)).toBe(-5);
});
});
describe группирует тесты по функциональности.it описывает отдельный тестовый случай.expect формирует утверждения, которые проверяют
поведение кода.Jasmine поддерживает асинхронные тесты через колбэки, промисы или
async/await.
С использованием done:
it('должна завершиться после таймера', (done) => {
setTimeout(() => {
expect(true).toBe(true);
done();
}, 1000);
});
С использованием промисов:
it('возвращает данные с сервера', () => {
return fetchData().then(data => {
expect(data).toBeDefined();
});
});
С использованием async/await:
it('должна получить данные', async () => {
const data = await fetchData();
expect(data).toBeDefined();
});
Jasmine позволяет создавать шпионы (spy) для
отслеживания вызовов функций или замены их поведения.
describe('Тестирование функции логирования', () => {
it('должна вызвать console.log', () => {
spyOn(console, 'log');
logMessage('Привет');
expect(console.log).toHaveBeenCalledWith('Привет');
});
});
Основные функции шпионов:
spyOn(obj, 'method') — заменяет метод объекта
шпионом.and.callFake(fn) — позволяет подменить реализацию
метода.and.returnValue(value) — возвращает фиксированное
значение.toHaveBeenCalled() и
toHaveBeenCalledWith() — проверка вызовов.Karma легко интегрируется в автоматизированные сборки. Для этого
обычно используется режим singleRun: true с
Headless-браузерами:
browsers: ['ChromeHeadless'],
singleRun: true,
Запуск тестов через командную строку:
npx karma start
В CI-системах (Jenkins, GitLab CI, GitHub Actions) рекомендуется использовать Headless Chrome для минимизации ресурсов и автоматического завершения тестов.
Karma поддерживает плагины для:
karma-coverage.karma-webpack, karma-typescript.karma-firefox-launcher, karma-safari-launcher,
karma-sauce-launcher.Пример конфигурации с покрытием кода:
preprocessors: {
'src/**/*.js': ['coverage']
},
reporters: ['progress', 'coverage'],
coverageReporter: {
type: 'html',
dir: 'coverage/'
}
Это позволяет генерировать отчеты в HTML и интегрировать их в процесс разработки и CI.
describe
отражал функциональные блоки.npm scripts:"scripts": {
"test": "karma start karma.conf.js"
}
Эта интеграция Jasmine с Karma обеспечивает надёжный и масштабируемый процесс тестирования, поддерживает асинхронные сценарии, отслеживание вызовов функций и возможность полной автоматизации в CI/CD средах.