Modern QA2026Фикстуры и тестовые данные
Join

Course13 Browser Automation with Playwright

Foundations · Chapter 13

Фикстуры и тестовые данные

Updated Jul 2026

Фикстуры Playwright — это система внедрения зависимостей, позволяющая определять переиспользуемую логику настройки/очистки — аутентифицированные сессии, тестовые данные, объекты страниц — и декларативно внедрять их в тесты. В сочетании с правильным управлением тестовыми данными фикстуры устраняют шаблонный код и делают тесты самодостаточными.

Встроенные фикстуры

Каждый тест @playwright/test автоматически получает встроенные фикстуры:

Фикстура Описание
page Новая страница в свежем контексте браузера
context Контекст браузера (владеет страницей)
browser Общий экземпляр браузера
request Контекст API-запросов для прямых HTTP-вызовов
browserName Имя текущего браузера (chromium, firefox, webkit)
// `page` и `context` свежие для каждого теста — нет общего состояния
test('пример', async ({ page, context, request }) => {
  // page: изолированная вкладка браузера
  // context: изолированная сессия браузера
  // request: API-вызовы без браузера
});

Пользовательские фикстуры

Пользовательские фикстуры позволяют расширить тестовую функцию собственными зависимостями:

// fixtures/auth.ts
import { test as base, expect } from '@playwright/test';
import { LoginPage } from '../pages/login.page';
import { DashboardPage } from '../pages/dashboard.page';

type MyFixtures = {
  loginPage: LoginPage;
  dashboardPage: DashboardPage;
  authenticatedPage: DashboardPage;
};

export const test = base.extend<MyFixtures>({
  loginPage: async ({ page }, use) => {
    const loginPage = new LoginPage(page);
    await loginPage.goto();
    await use(loginPage);
  },

  dashboardPage: async ({ page }, use) => {
    await use(new DashboardPage(page));
  },

  authenticatedPage: async ({ page }, use) => {
    const loginPage = new LoginPage(page);
    await loginPage.goto();
    await loginPage.login('test@example.com', 'password');
    await use(new DashboardPage(page));
  },
});

export { expect };

Использование пользовательских фикстур

// tests/dashboard.spec.ts
import { test, expect } from '../fixtures/auth';

// Получает уже аутентифицированную страницу панели управления
test('панель показывает имя пользователя', async ({ authenticatedPage }) => {
  await expect(authenticatedPage.userName).toHaveText('Тестовый пользователь');
});

// Получает только страницу входа
test('неверный вход показывает ошибку', async ({ loginPage }) => {
  await loginPage.login('bad@test.com', 'wrong');
  expect(await loginPage.getErrorMessage()).toContain('Invalid');
});

Переиспользование состояния аутентификации

Вход через UI для каждого теста — медленный. storageState в Playwright позволяет аутентифицироваться один раз и переиспользовать сессию во всех тестах.

// auth.setup.ts — выполняется один раз перед всеми тестами
import { test as setup } from '@playwright/test';

setup('аутентификация', async ({ page }) => {
  await page.goto('/login');
  await page.getByLabel('Email').fill('test@example.com');
  await page.getByLabel('Password').fill('password');
  await page.getByRole('button', { name: 'Sign in' }).click();
  await page.waitForURL('/dashboard');

  // Сохранение состояния аутентификации (cookies + localStorage)
  await page.context().storageState({ path: '.auth/user.json' });
});

// playwright.config.ts
export default defineConfig({
  projects: [
    { name: 'setup', testMatch: /.*\.setup\.ts/ },
    {
      name: 'tests',
      dependencies: ['setup'],
      use: { storageState: '.auth/user.json' },
    },
  ],
});

Теперь все тесты в проекте tests запускаются уже залогиненными — без UI-взаимодействия для входа в каждом тесте.

Управление тестовыми данными

Настройка через API (рекомендуется)

Создавайте тестовые данные через API перед UI-тестами — быстрее и надёжнее, чем настройка через UI:

test.beforeEach(async ({ request }) => {
  // Создание тестовых данных через API
  await request.post('/api/products', {
    data: { name: 'Тестовый товар', price: 29.99 },
  });
});

test('товар появляется в каталоге', async ({ page }) => {
  await page.goto('/products');
  await expect(page.getByText('Тестовый товар')).toBeVisible();
});

test.afterEach(async ({ request }) => {
  // Очистка через API
  await request.delete('/api/products/test-product');
});

Тестовые данные через фикстуры

type TestData = {
  testUser: { email: string; password: string };
  testProduct: { name: string; price: number };
};

export const test = base.extend<TestData>({
  testUser: async ({}, use) => {
    await use({ email: 'test@example.com', password: 'password' });
  },
  testProduct: async ({ request }, use) => {
    // Создание товара через API
    const response = await request.post('/api/products', {
      data: { name: `Product-${Date.now()}`, price: 29.99 },
    });
    const product = await response.json();
    await use(product);
    // Очистка: удаление после теста
    await request.delete(`/api/products/${product.id}`);
  },
});

Ключевые выводы

  • Встроенные фикстуры (page, context, request) обеспечивают изолированные свежие окружения для каждого теста
  • Пользовательские фикстуры внедряют переиспользуемую настройку (объекты страниц, аутентифицированные сессии, тестовые данные) в тесты
  • storageState позволяет аутентифицироваться один раз и переиспользовать сессии — устраняя накладные расходы на вход для каждого теста
  • Создавайте тестовые данные через API в фикстурах для скорости и надёжности — не через UI
  • Фикстуры обеспечивают автоматическую очистку — код после await use() выполняется после завершения теста