Нестабильные тесты — это те сценарии, которые иногда проходят успешно, а иногда завершаются сбоем без изменений в коде приложения. Их наличие снижает доверие к тестовому набору и усложняет выявление реальных дефектов. В Playwright существует несколько методов для минимизации нестабильности и обеспечения изоляции тестов.
Зависимость от состояния браузера Если тесты используют общий контекст или страницу, данные предыдущих тестов могут влиять на текущий. Например, сохранённые куки или локальное хранилище.
Асинхронные операции и тайминги Ошибки могут возникать из-за задержек сети, медленной загрузки элементов или неправильного ожидания элементов.
Конкуренция за ресурсы Запуск нескольких тестов на одном браузере или сервере может вызывать конфликты, если они используют одни и те же данные или ресурсы.
Влияние внешних сервисов Интеграционные тесты, обращающиеся к внешним API или базам данных, могут ломаться из-за сетевых сбоев или изменений данных.
Playwright позволяет создавать отдельный контекст браузера для каждого теста:
const { test, chromium } = require('@playwright/test');
test('тест с изолированным контекстом', async ({}) => {
const browser = await chromium.launch();
const context = await browser.newContext(); // отдельный контекст
const page = await context.newPage();
await page.goto('https://example.com');
// операции с страницей
await context.close();
await browser.close();
});
Преимущества:
Для гарантированной чистоты среды можно очищать куки и локальное хранилище:
test.beforeEach(async ({ page }) => {
await page.context().clearCookies();
await page.evaluate(() => localStorage.clear());
});
Ключевой момент: это обеспечивает предсказуемое состояние страницы перед каждым тестом.
Фикстуры (fixtures) позволяют настраивать окружение для
каждого теста, обеспечивая изоляцию:
const { test } = require('@playwright/test');
test.use({
viewport: { width: 1280, height: 720 },
storageState: null, // отсутствие сохранённого состояния
});
test('тест с фикстурами', async ({ page }) => {
await page.goto('https://example.com');
});
Фикстуры могут быть глобальными или локальными для отдельных тестов, что уменьшает риск побочных эффектов.
Playwright поддерживает параллельное выполнение тестов. Для безопасного запуска:
// playwright.config.js
module.exports = {
workers: 4, // количество параллельных потоков
};
Параллельность ускоряет тесты, но требует строгой изоляции ресурсов.
Нестабильность часто вызвана неправильной синхронизацией:
await page.waitForSelector('#element', { state: 'visible', timeout: 5000 });
await page.click('#element');
Советы:
state: 'visible' или
state: 'attached' вместо простого ожидания.sleep, предпочитая ожидания состояния
элементов.Для уменьшения зависимости от внешних сервисов используют мок-серверы и стабы:
await page.route('**/api/data', route =>
route.fulfill({
status: 200,
body: JSON.stringify({ key: 'value' }),
})
);
Преимущества:
Если тест всё равно нестабилен, его можно временно пометить:
test.describe.skip('нестабильные тесты', () => {
test('иногда падает', async ({ page }) => {
await page.goto('https://example.com');
});
});
Или использовать test.fail() с комментарием для фиксации
причины падения. Это помогает не блокировать весь набор тестов.
waitForSelector, waitForResponse).Изоляция нестабильных тестов в Playwright сочетает правильное управление контекстом, очистку состояния, мокирование и контроль асинхронных операций, что обеспечивает предсказуемость и высокую надежность тестового набора.