Тестирование интерфейсов с использованием скриншотов — важный аспект автоматизации UI-тестирования. В Playwright создание baseline скриншотов является ключевым шагом для автоматического сравнения визуальных изменений в приложении. Это позволяет выявить нежелательные или неожиданные изменения в UI, которые могут возникнуть при разработке или после внесения изменений в код.
Baseline скриншоты — это эталонные изображения интерфейса, которые используются для сравнения с текущими скриншотами, сделанными во время тестов. Когда скриншот текущего состояния приложения отличается от baseline, тест считается проваленным. Это может свидетельствовать о нежеланных изменениях в UI, таких как неправильное позиционирование элементов, искажения дизайна или ошибки в верстке.
Подготовка окружения:
Убедитесь, что Playwright установлен и настроен в проекте. Для этого нужно выполнить команду:
npm install playwrightДля работы с базовыми скриншотами потребуется библиотека
playwright и, возможно, дополнительные инструменты для
сравнения изображений, такие как pixelmatch или
jest-image-snapshot.
Создание теста с baseline скриншотами: Сначала необходимо сделать скриншот базового состояния приложения. Это будет ваш baseline. Пример базового теста, который захватывает скриншот страницы:
const { test, expect } = require('@playwright/test');
test('capture baseline screenshot', async ({ page }) => {
await page.goto('https://example.com');
await page.screenshot({ path: 'baseline-example.png' });
});
Этот тест откроет страницу https://example.com и сделает
скриншот, сохраняя его в файл baseline-example.png. Этот
файл будет использоваться для дальнейшего сравнения с текущими
скриншотами.
Создание сравнения с baseline: Чтобы проверить,
что внешний вид страницы не изменился, необходимо сделать новый скриншот
и сравнить его с baseline. Для этого можно использовать библиотеку
pixelmatch, которая предоставляет функциональность для
сравнения изображений.
Пример теста с использованием pixelmatch:
const fs = require('fs');
const pixelmatch = require('pixelmatch');
const { PNG } = require('pngjs');
const { test, expect } = require('@playwright/test');
test('compare screenshot with baseline', async ({ page }) => {
await page.goto('https://example.com');
const screenshot = await page.screenshot();
const baselineImage = PNG.sync.read(fs.readFileSync('baseline-example.png'));
const currentImage = PNG.sync.read(screenshot);
const { width, height } = baselineImage;
const diff = new PNG({ width, height });
const numDiffPixels = pixelmatch(
baselineImage.data,
currentImage.data,
diff.data,
width,
height,
{ threshold: 0.1 }
);
fs.writeFileSync('diff.png', PNG.sync.write(diff));
expect(numDiffPixels).toBe(0);
});
В этом примере:
page.screenshot() делает текущий скриншот.baseline-example.png считывается как эталон.pixelmatch. Если изображения совпадают, количество
отличающихся пикселей будет равно нулю, и тест пройдет успешно.diff.png, который
показывает различия между скриншотами.Использование Jest для автоматического
сравнения: Для улучшения тестирования и упрощения процесса
можно интегрировать jest-image-snapshot в проект. Это
позволит автоматизировать процессы сравнения и отчетности.
Установите зависимость:
npm install jest-image-snapshot
Пример использования с Jest:
const { test, expect } = require('@playwright/test');
const { toMatchImageSnapshot } = require('jest-image-snapshot');
expect.extend({ toMatchImageSnapshot });
test('visual regression test', async ({ page }) => {
await page.goto('https://example.com');
const screenshot = await page.screenshot();
expect(screenshot).toMatchImageSnapshot();
});
В этом примере jest-image-snapshot автоматически будет
сравнивать текущий скриншот с baseline, и если изображения не совпадают,
тест завершится ошибкой.
Как правило, baseline скриншоты хранятся в репозиториях в отдельной директории, чтобы их можно было легко обновить при необходимости. Важно помнить, что при изменении UI необходимо пересоздавать baseline скриншоты, чтобы новые изменения были учтены.
Рекомендуется использовать систему контроля версий (например, Git) для хранения baseline скриншотов. Это позволит отслеживать изменения в UI и откатывать тесты при необходимости.
Когда приложение обновляется и изменяется внешний вид, важно обновить baseline скриншоты. Это можно сделать, заменив старые baseline файлы на новые, когда изменения в UI являются ожидаемыми и корректными.
Процесс обновления baseline может быть автоматизирован с помощью отдельного теста или утилиты. Например, можно добавить флаг или команду в тестах, чтобы обновить baseline, если это необходимо:
const fs = require('fs');
const { test } = require('@playwright/test');
test('update baseline screenshot', async ({ page }) => {
await page.goto('https://example.com');
const screenshot = await page.screenshot();
fs.writeFileSync('baseline-example.png', screenshot);
});
Этот тест перезапишет старый скриншот и создаст новый baseline.
Преимущества:
Недостатки:
Создание baseline скриншотов — мощный инструмент для автоматического тестирования UI, который помогает поддерживать стабильность интерфейса приложения. Этот процесс эффективен при правильно организованном тестировании и хорошем управлении baseline файлами.