Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
В этой статье рассмотрим одну из самых мощных и недооцененных функций Playwright — фикстуры. Если вам знакомы Jest, Mocha или Cypress, вы наверняка использовали beforeEach и afterEach. Но в Playwright работа с фикстурами построена гораздо более системно и гибко.
Этот материал поможет разобраться, как устроена система фикстур в Playwright и как с её помощью настраивать жизненный цикл тестов через test.describe, beforeEach, use и общий контекст. Также разберем ключевые идеи, практические кейсы и рекомендации по применению.
Что такое фикстуры в Playwright?
В Playwright Test фикстуры — это переиспользуемые блоки, которые помогают подготовить и очистить всё, что нужно для тестов. К ним можно отнести:
- управление браузером и тестовым контекстом;
- настройка страниц;
- авторизованные сессии;
- мок-данные или ответы API;
- любую кастомную логику подготовки для отдельного теста или всего набора тестов.
Основное преимущество фикстур — возможность писать компактный и структурированный код, делиться контекстом между тестами и запускать их параллельно без необходимости вручную управлять жизненным циклом.
Основы жизненного цикла фикстур в Playwright
В Playwright тесты выполняются по строго определённому жизненному циклу, который управляется фикстурами:
- Глобальная настройка (
global-setup, опционально) - Настройка для конкретного проекта
- Настройка на уровне каждого теста (
beforeEach,afterEach) - Настройка для группы тестов (
test.describe) - Очистка ресурсов (teardown)
Пример использования:
import { test, expect } from ‘@playwright/test’;
test.beforeEach(async ({ page }) => {
await page.goto(‘https://example.com');
});
test(‘Page title should be correct’, async ({ page }) => {
await expect(page).toHaveTitle(‘Example Domain’);
});
В этом примере page — встроенная фикстура, предоставляемая Playwright.
Кастомные фикстуры: когда и зачем их применять
Встроенные фикстуры вроде browser, context и page подходят для многих сценариев, но в реальных проектах часто требуется своя настройка:
- установка куки или токенов для авторизации;
- загрузка тестовых данных перед выполнением теста;
- управление моками базы данных или API;
- внедрение feature-флагов или конфигураций.
Создать собственную фикстуру просто — через test.extend:
import { test as base } from ‘@playwright/test’;
const test = base.extend<{
authToken: string;
}>({
authToken: async ({}, use) => {
const token = await fetchTokenFromAPI();
await use(token);
},
});
test(‘Authenticated API call’, async ({ request, authToken }) => {
const res = await request.get(‘/secure-endpoint’, {
headers: { Authorization: `Bearer ${authToken}` }
});
expect(res.ok()).toBeTruthy();
});
✅ Вывод: фикстуры позволяют централизованно управлять подготовкой и передавать её в тестовый контекст.
Настройка фикстур через test.use()
С помощью test.use() можно изменить параметры фикстур для конкретного теста или группы тестов.
test.use({
storageState: ‘logged-in.json’, // for authentication
viewport: { width: 1280, height: 720 },
});
test(‘Test with custom viewport’, async ({ page }) => {
await page.goto(‘/dashboard’);
// your test logic
});
Это особенно полезно, когда необходимо запускать один и тот же тест в разных условиях — например, с мобильным и десктопным разрешением экрана или под авторизованным и гостевым пользователем.
Читайте также: Большой учебник по Playwright
beforeEach, afterEach и управление жизненным циклом теста
Playwright поддерживает стандартные хуки жизненного цикла, аналогичные тем, что есть в Mocha или Jest:
test.beforeEach(async ({ page }) => {
await page.goto(‘/login’);
});
test.afterEach(async ({ page }) => {
// Optional cleanup
});
Эти хуки выполняются для каждого теста и срабатывают до и после каждого тест-кейса в текущем файле или блоке.
Если нужно сгруппировать тесты с общей логикой подготовки, используется test.describe():
test.describe(‘Admin Panel’, () => {
test.beforeEach(async ({ page }) => {
await page.goto(‘/admin’);
// assume admin login
});
test(‘Can see admin dashboard’, async ({ page }) => {
await expect(page.locator(‘h1’)).toHaveText(‘Admin Dashboard’);
});
});
Таким образом тесты объединяются в логический блок, а общая подготовка выполняется один раз для каждого теста внутри него.
Как делиться контекстом между тестами
В ряде сценариев требуется использовать общее состояние в нескольких тестах — например, данные авторизованной сессии или предварительно загруженную информацию. Несмотря на принцип изоляции тестов, в Playwright можно безопасно организовать совместное использование состояния через фикстуры.
Пример реализации:
const test = base.extend<{
userSession: { token: string; userId: string };
}>({
userSession: async ({}, use) => {
const session = await loginAndGetSession();
await use(session);
},
});
test(‘User session is valid’, async ({ userSession }) => {
expect(userSession.token).toBeDefined();
});
Это намного аккуратнее и проще в сопровождении, чем хранить состояние в глобальных переменных или подтягивать его из внешних файлов.
Заключение
Модель фикстур в Playwright позволяет выстраивать модульную, гибко настраиваемую и масштабируемую архитектуру автотестов. Будь то UI-тесты, API-проверки или смешанные сценарии, фикстуры позволяют управлять окружением тестов без ущерба для скорости и поддержки кода.
Перевод статьи «Playwright Test Fixtures Explained: Customizing Test Lifecycle».