Karma — это тестовый раннер для JavaScript, который обеспечивает запуск тестов в реальных браузерах. Основное преимущество использования Karma при работе с DOM заключается в возможности проверять взаимодействие компонентов и элементов страницы так, как это происходит в браузере у пользователя.
Для работы с DOM-тестами в Karma требуется подключение соответствующих фреймворков и библиотек, таких как Jasmine, Mocha или Chai, а также библиотек для манипуляции DOM, например jQuery или jsdom. Karma позволяет эмулировать DOM в Node.js через jsdom, если нет необходимости запускать браузер, или тестировать непосредственно в реальных браузерах.
Конфигурация Karma для работы с DOM обычно включает следующие ключевые параметры:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
browsers: ['ChromeHeadless'],
singleRun: true
});
};
Ключевые моменты конфигурации:
ChromeHeadless, FirefoxHeadless.true,
тесты выполняются один раз и процесс завершается, что удобно для
CI/CD.Для проверки DOM-элементов используется стандартный API браузера:
методы document.querySelector,
document.createElement, appendChild, а также
свойства элементов (innerHTML, classList,
value и др.). Karma выполняет эти тесты в реальном DOM
браузера, что делает результаты максимально приближенными к
пользовательским сценариям.
Пример теста с DOM:
describe('DOM-элемент', function() {
let container;
beforeEach(function() {
container = document.createElement('div');
container.id = 'test-container';
document.body.appendChild(container);
});
afterEach(function() {
document.body.removeChild(container);
container = null;
});
it('должен содержать нужный текст', function() {
container.innerHTML = '<p>Hello Karma</p>';
const paragraph = container.querySelector('p');
expect(paragraph.textContent).toBe('Hello Karma');
});
it('должен иметь правильный класс', function() {
container.classList.add('active');
expect(container.classList.contains('active')).toBe(true);
});
});
Особенности работы с DOM:
beforeEach и afterEach позволяют
подготовить изолированное DOM-окружение для каждого теста, предотвращая
влияние предыдущих тестов на последующие.querySelector и querySelectorAll
обеспечивают гибкое получение элементов по селекторам.textContent,
value, checked, classList)
позволяет валидировать визуальное поведение компонентов.Для сложных взаимодействий с DOM часто применяются вспомогательные библиотеки:
@testing-library/dom) — предоставляет высокоуровневые
методы для проверки наличия элементов, кликов и ввода текста.Пример использования Testing Library с Karma:
import { getByText, fireEvent } from '@testing-library/dom';
describe('Кнопка', () => {
let container;
beforeEach(() => {
container = document.createElement('div');
container.innerHTML = `<button id="btn">Нажми меня</button>`;
document.body.appendChild(container);
});
afterEach(() => {
document.body.removeChild(container);
container = null;
});
it('кликает на кнопку и проверяет текст', () => {
const button = getByText(container, 'Нажми меня');
fireEvent.click(button);
expect(button.textContent).toBe('Нажми меня');
});
});
Многие операции с DOM являются асинхронными: анимации, AJAX-запросы,
таймеры. Karma поддерживает работу с асинхронными тестами через
done колбэк или возвращение Promise.
Пример с Promise:
it('должен обновлять текст после задержки', (done) => {
const div = document.createElement('div');
document.body.appendChild(div);
setTimeout(() => {
div.textContent = 'Обновлено';
expect(div.textContent).toBe('Обновлено');
done();
}, 100);
});
Аналогично можно использовать async/await:
it('асинхронное обновление текста', async () => {
const div = document.createElement('div');
document.body.appendChild(div);
await new Promise(resolve => setTimeout(resolve, 100));
div.textContent = 'Обновлено';
expect(div.textContent).toBe('Обновлено');
});
Karma легко интегрируется в процессы непрерывной интеграции. Для тестирования DOM рекомендуется использовать Headless-браузеры, что ускоряет выполнение тестов и позволяет запускать их на сервере без GUI. Для крупных проектов важно настроить конфигурацию Karma так, чтобы тесты выполнялись параллельно и изолированно, избегая зависимости от состояния DOM предыдущих тестов.
Оптимизация:
beforeEach и afterEach для
очистки DOM.Этот подход обеспечивает стабильные и воспроизводимые результаты при тестировании пользовательских интерфейсов и DOM-операций.