Jest и Playwright — это два популярных инструмента в экосистеме JavaScript. Jest часто используется для модульного тестирования, в то время как Playwright служит для автоматизации браузеров и тестирования пользовательских интерфейсов. Интеграция этих инструментов позволяет создавать мощные тесты, которые охватывают как функциональность кода, так и взаимодействие с веб-интерфейсами в реальном браузере.
Для начала требуется установить все необходимые пакеты. Playwright и Jest можно установить через npm:
npm install --save-dev jest playwright
После этого потребуется настроить Jest. В корневой директории проекта
необходимо создать файл конфигурации jest.config.js, если
его ещё нет. В конфигурации указывается обработчик для асинхронных
операций с браузером, который Playwright будет использовать.
Пример базовой настройки Jest:
module.exports = {
preset: 'jest-playwright-preset',
testTimeout: 30000, // Увеличение времени ожидания для асинхронных тестов
};
Jest не поддерживает Playwright напрямую, поэтому необходимо
использовать промежуточное решение, например,
jest-playwright. Этот пакет облегчает интеграцию и
позволяет запускать тесты в реальных браузерах.
Установите дополнительно пакет:
npm install --save-dev jest-playwright-preset
В конфигурации Jest, добавленной выше, указывается использование
jest-playwright-preset как предустановки. Этот шаг
автоматизирует настройку Playwright для работы с Jest, включая установку
браузеров и базовую конфигурацию.
Для создания тестов, использующих Playwright, важно понимать, как взаимодействовать с элементами страницы в браузере и управлять браузером в процессе тестирования. Playwright предоставляет возможности для работы с различными браузерами, такими как Chromium, Firefox и WebKit.
Пример простого теста с использованием Playwright в Jest:
describe('Интерактивный тест с Playwright', () => {
it('проверка текста на главной странице', async () => {
await page.goto('https://example.com');
const text = await page.textContent('h1');
expect(text).toBe('Пример заголовка');
});
it('клик по кнопке и проверка изменения текста', async () => {
await page.goto('https://example.com');
await page.click('button#myButton');
const buttonText = await page.textContent('button#myButton');
expect(buttonText).toBe('Кнопка нажата');
});
});
В этом примере page.goto() открывает указанную страницу,
а методы типа textContent() и click()
позволяют взаимодействовать с элементами на странице. Каждый тест
асинхронно выполняет действия в браузере и проверяет ожидаемый
результат.
Один из важных аспектов при тестировании с Playwright — управление асинхронными операциями. В большинстве случаев операции взаимодействия с элементами страницы (загрузка контента, клик, наведение и т. д.) происходят с задержками. Playwright предоставляет механизмы для явных и неявных ожиданий, чтобы убедиться, что элемент стал доступен или действие завершено.
Пример явного ожидания появления элемента:
it('ожидание загрузки элемента', async () => {
await page.goto('https://example.com');
await page.waitForSelector('h1');
const title = await page.textContent('h1');
expect(title).toBe('Пример заголовка');
});
Здесь используется waitForSelector(), который блокирует
выполнение теста до тех пор, пока не появится нужный элемент. Это
предотвращает ошибки, связанные с попытками взаимодействовать с
элементами до их полной загрузки.
Playwright поддерживает эмуляцию множества действий пользователя, таких как ввод текста, перемещение мыши и даже взаимодействие с элементами, не видимыми на экране (например, скрытые поля или элементы за пределами видимой области).
Пример эмуляции ввода текста в форму:
it('ввод данных в форму', async () => {
await page.goto('https://example.com/login');
await page.fill('input[name="username"]', 'testuser');
await page.fill('input[name="password"]', 'password123');
await page.click('button[type="submit"]');
const message = await page.textContent('.message');
expect(message).toBe('Добро пожаловать, testuser!');
});
Метод fill() позволяет заполнить поля формы, а
click() выполняет клик по кнопке. Это позволяет эмулировать
реальные действия пользователя, что важно для тестирования
интерфейсов.
Иногда необходимо замокать определённые сетевые запросы или API
вызовы, чтобы тестировать интерфейсы без зависимости от внешних
сервисов. Playwright поддерживает возможность перехвата запросов с
помощью page.route().
Пример замоканного API-запроса:
it('замокать запрос API', async () => {
await page.goto('https://example.com');
await page.route('**/api/user', route => {
route.fulfill({
status: 200,
body: JSON.stringify({ user: 'testuser' }),
});
});
await page.click('button#fetchUser');
const userName = await page.textContent('.userName');
expect(userName).toBe('testuser');
});
Здесь route.fulfill() позволяет возвращать замоканные
данные при вызове конкретного API. Это полезно для тестирования UI без
зависимости от реальных серверов.
Playwright позволяет запускать тесты в нескольких контекстах браузеров, что полезно для тестирования мульти-страничных приложений или изоляции тестов.
Пример запуска нескольких контекстов:
it('многоконтекстные тесты', async () => {
const context1 = await browser.newContext();
const context2 = await browser.newContext();
const page1 = await context1.newPage();
const page2 = await context2.newPage();
await page1.goto('https://example.com');
await page2.goto('https://example.com');
const title1 = await page1.title();
const title2 = await page2.title();
expect(title1).toBe('Пример');
expect(title2).toBe('Пример');
});
Здесь создаются два отдельных контекста браузера, что позволяет изолировать данные и сессии между тестами, предотвращая влияние одного теста на другой.
Playwright поддерживает несколько браузеров, включая Chromium, Firefox и WebKit. Для тестирования в разных браузерах можно использовать настройку в Jest.
Пример конфигурации для запуска тестов в Chromium, Firefox и WebKit:
module.exports = {
preset: 'jest-playwright-preset',
browsers: ['chromium', 'firefox', 'webkit'],
};
Такая настройка позволяет проверить работоспособность приложения в разных браузерах, что важно для кросс-браузерного тестирования.
Тесты с использованием браузеров могут быть медленными, особенно при выполнении большого числа взаимодействий. Чтобы улучшить производительность, можно:
Использовать headless режим — запускайте браузеры без графического интерфейса, что ускоряет их работу.
browser = await playwright.chromium.launch({ headless: true });Использовать многозадачность — запускайте тесты параллельно в разных браузерах или контекстах.
Использовать персистентные сессии — сохраняйте состояние браузера между тестами с помощью сессий.
Интеграция Jest с Playwright предоставляет мощные возможности для тестирования как логики приложения, так и интерфейса пользователя. Используя эти инструменты вместе, можно автоматизировать тестирование браузера с учётом всех его особенностей и создать более надёжные и быстрые тесты для веб-приложений.