Фикстуры и тестовые данные
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()выполняется после завершения теста