Как проводится скриншотное (визуальное регрессионное) тестирование?

«Как проводится скриншотное (визуальное регрессионное) тестирование?» — вопрос из категории Веб-тестирование, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моей практике скриншотное тестирование — это ключевой инструмент для обнаружения непреднамеренных визуальных изменений. Вот как я его организую:

Технический стек, который я использую:

  • Playwright или Cypress для современных проектов (встроенная поддержка скриншотов)
  • Selenium + Applitools Eyes или Percy для legacy-проектов
  • GitHub Actions / GitLab CI для запуска в CI/CD

Пример реализации на Playwright (TypeScript):

import { test, expect } from '@playwright/test';

test('homepage visual regression', async ({ page }) => {
  await page.goto('https://example.com');

  // 1. Сделать скриншот всей страницы
  expect(await page.screenshot()).toMatchSnapshot('homepage-full.png');

  // 2. Сделать скриншот конкретного элемента
  const header = page.locator('header');
  expect(await header.screenshot()).toMatchSnapshot('header.png');

  // 3. Скриншот с разными состояниями
  await page.locator('.theme-switcher').click();
  expect(await page.screenshot()).toMatchSnapshot('homepage-dark.png');
});

Критические аспекты, которые я учитываю:

1. Подготовка эталонов:

# Первый запуск — создание эталонных скриншотов
npx playwright test --update-snapshots

2. Игнорирование динамического контента:

// В Playwright можно маскировать элементы
await page.locator('.current-date').evaluate(el => el.style.visibility = 'hidden');

3. Настройка порогов различий:

// Максимально допустимая разница в пикселях (0.1 = 10%)
expect(await page.screenshot()).toMatchSnapshot({
  name: 'homepage.png',
  maxDiffPixelRatio: 0.1
});

4. Кросс-браузерное тестирование:

// В конфигурации Playwright
test.use({
  browserName: 'chromium', // также 'firefox', 'webkit'
  viewport: { width: 1920, height: 1080 }
});

Процесс в CI/CD:

  1. При пулл-реквесте запускаются скриншотные тесты
  2. Percy/Applitools генерирует diff-отчет
  3. Разработчик проверяет различия и утверждает изменения
  4. Утвержденные скриншоты становятся новыми эталонами

Основные проблемы и их решения:

  • Флоппи-тесты: Использую стабильные селекторы и ожидания
  • Большие diff: Настраиваю область сравнения и пороги
  • Производительность: Делаю скриншоты только критичных компонентов