Отчёты, визуальное тестирование и стратегия

Финальный урок: как читать результаты, проверять внешний вид и какой стратегии держаться, чтобы тесты приносили пользу.

HTML-отчёт показывает результаты прогона наглядно; визуальное тестирование сравнивает скриншот страницы с эталоном; стратегия решает, что вообще покрывать E2E.

HTML-отчёт

Репортёр html создаёт интерактивный отчёт: список тестов, время, причины падений, а для упавших — скриншоты, трейсы и логи. Это первое, куда смотрят после прогона.

npx playwright test
npx playwright show-report

В отчёте можно фильтровать по статусу (passed/failed/flaky), раскрыть упавший тест и сразу увидеть трейс — где именно сломалось. В CI можно включить несколько репортёров: человекочитаемый в терминале и машиночитаемый для системы.

export default defineConfig({
  reporter: [
    ['list'],                                 // в консоль
    ['html', { open: 'never' }],              // HTML-файл
    ['junit', { outputFile: 'results.xml' }], // для CI-систем
  ],
});

Визуальное тестирование

Иногда важно проверить не текст, а внешний вид: не съехала ли вёрстка, на месте ли логотип. Для этого есть снимок-сравнение toHaveScreenshot. При первом запуске Playwright сохраняет эталон (baseline), а дальше сравнивает с ним.

test('главная выглядит как эталон', async ({ page }) => {
  await page.goto('/');
  await expect(page).toHaveScreenshot('homepage.png');
});

Если вёрстка изменилась намеренно, эталон обновляют флагом npx playwright test --update-snapshots. Визуальные тесты особенно склонны к флаки: разные шрифты на разных ОС, анимации, динамические данные (дата, реклама). Поэтому их «приручают».

ПроблемаЧто делать
Анимацииотключить (animations: 'disabled')
Динамический текстзамаскировать область (mask)
Разные ОСгенерировать эталоны в том же окружении (CI)
await expect(page).toHaveScreenshot('home.png', {
  animations: 'disabled',
  mask: [page.getByTestId('current-date')],
});

Стратегия: что покрывать E2E

Вернёмся к пирамиде из первого раздела. E2E дорог, поэтому покрывайте им только то, что нельзя надёжно проверить ниже.

Покрывать E2EОставить юнит/интеграции
Критичные пути: вход, оплата, заказЛогика расчётов и валидации
Связка фронтенда и бэкенда на главном сценарииВсе ветки условий и краевые случаи
«Дымовой» проход по ключевым страницамФорматирование, утилиты, парсинг

Правило: на каждый бизнес-сценарий — один-два E2E на «счастливый путь» и важнейшую ошибку. Все остальные вариации — дешёвыми тестами ниже по пирамиде.

Чек-лист хорошего E2E-теста

  • Семантические локаторы. getByRole/getByText, а не CSS-классы и XPath по позиции.
  • Никаких waitForTimeout. Доверяйтесь авто-ожиданиям и web-first assertions.
  • Изоляция. Тест не зависит от других, использует чистый контекст и уникальные данные.
  • Одна проверяемая идея. Тест проверяет один сценарий, а не десять разом.
  • Понятное имя и стабильность — зелёный в десяти прогонах подряд, не только «обычно».
// ❌ хрупкий локатор + ручная пауза + чтение «сейчас»
await page.click('.btn-x7f');
await page.waitForTimeout(2000);
expect(await page.locator('.msg').textContent()).toBe('Готово');

// ✅ семантика + авто-ожидание + web-first assertion
await page.getByRole('button', { name: 'Сохранить' }).click();
await expect(page.getByText('Готово')).toBeVisible();

Куда двигаться дальше

  • Компонентное тестирование Playwright — проверка отдельных UI-компонентов, мостик к нижним уровням пирамиды.
  • API-тестирование встроенным request — быстрые проверки бэкенда без браузера.
  • Доступность (a11y): интеграция с axe для автопроверок доступности.
  • Codegen: npx playwright codegen записывает действия в браузере и генерирует код теста — полезно для старта.
npx playwright codegen https://example.com

Итог

  • HTML-отчёт — главный способ разобрать прогон: статусы, скриншоты, трейсы.
  • toHaveScreenshot сравнивает страницу с эталоном; склонен к флаки — отключайте анимации, маскируйте динамику, генерируйте эталоны в CI.
  • Покрывайте E2E немного критичных сценариев; детали — ниже по пирамиде.
  • Хороший тест: семантические локаторы, без пауз, изолирован, стабилен. Дальше — компонентные и API-тесты, a11y, codegen.
Проверьте себя
1. Что показывает HTML-отчёт Playwright для упавшего теста?
AТолько название теста
BСкриншоты, трейсы и логи, чтобы понять причину падения
CИсходный код всего приложения
DСписок зависимостей npm
2. Почему визуальные тесты особенно склонны к флаки?
AИз-за разных шрифтов, анимаций и динамических данных
BПотому что Playwright их плохо поддерживает
CИз-за headless-режима
DОни вообще не бывают флаки
3. Какой сценарий — правильный кандидат на покрытие именно E2E-тестом?
AКаждая ветка условия в функции расчёта
BКритичный путь пользователя: вход или оформление заказа
CФорматирование числа в строку
DВсе возможные краевые случаи валидации
4. Что делает команда npx playwright codegen?
AУдаляет упавшие тесты
BЗаписывает действия в браузере и генерирует код теста
CПубликует HTML-отчёт
DУстанавливает браузеры
Поддержать проект