Разбор фикстур в Playwright Test и настройка жизненного цикла теста

Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ

В этой статье рассмотрим одну из самых мощных и недооцененных функций Playwright — фикстуры. Если вам знакомы Jest, Mocha или Cypress, вы наверняка использовали beforeEach и afterEach. Но в Playwright работа с фикстурами построена гораздо более системно и гибко.

Этот материал поможет разобраться, как устроена система фикстур в Playwright и как с её помощью настраивать жизненный цикл тестов через test.describe, beforeEach, use и общий контекст. Также разберем ключевые идеи, практические кейсы и рекомендации по применению.

Что такое фикстуры в Playwright?

В Playwright Test фикстуры — это переиспользуемые блоки, которые помогают подготовить и очистить всё, что нужно для тестов. К ним можно отнести:

  • управление браузером и тестовым контекстом;
  • настройка страниц;
  • авторизованные сессии;
  • мок-данные или ответы API;
  • любую кастомную логику подготовки для отдельного теста или всего набора тестов.

Основное преимущество фикстур — возможность писать компактный и структурированный код, делиться контекстом между тестами и запускать их параллельно без необходимости вручную управлять жизненным циклом.

Основы жизненного цикла фикстур в Playwright

В Playwright тесты выполняются по строго определённому жизненному циклу, который управляется фикстурами:

  1. Глобальная настройка (global-setup, опционально)
  2. Настройка для конкретного проекта
  3. Настройка на уровне каждого теста (beforeEach, afterEach)
  4. Настройка для группы тестов (test.describe)
  5. Очистка ресурсов (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».

🔥 Какой была ваша первая зарплата в QA и как вы искали первую работу? 

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Читать в телеграм

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *