Частая проблема верстальщика - поправил стили в одном месте, а изменилось в нескольких местах. И верстальщик замечает это слишком поздно. В данном посте я расскажу о регрессивном тестировании. Суть метода заключается в том, что вы делаете скриншоты сайта(не вручную конечно), а затем после внесения каких-либо правок вы делаете новые скриншоты и сравниваете их с предыдущими. Если есть какие-либо отличия - тесты об этом говорят и показывают. Можно делать скриншоты как сайтов, так и отдельных блоков.
Установка может занять некоторое время, так как в пакет puppeteer входит установка браузера chromium
Настройка gulp.js
Прописываем зависимости для установленных пакетов
Конфигурация под конкретный проект:
Указываем ширину страницу при тестировании
И список тестируемых страниц вносим в массив pageList:
Будущая структура результатов теста
Все результаты будут храниться в папке test, котороая будет поделена еще на 3 подкаталога:
before - для хранения эталонных скриншотов
after - для хранения новых скриншотов, которые впоследствии будут сравниваться
difference - для хранения результата сравнения новых скриншотов с эталонными
Создаем переменные для сохранения путей:
Создание тасков
1.Такс создания эталонных скриншотов
Изначально с помощью модуля fs создаем каталоги в которых будут храниться результаты тестирования, если они отсутствуют. А так же очищаем от старых скриншотов, если такие имеются.
После проходим по массиву страниц pageList, который мы заполнили ранее.
В page.goto указываем адрес страниц, в данном случае это http://localhost:1337/
В page.screenshot - каталог для сохраниния скриншотов, а так же указываем fullPage: true для сохранения страницы целиком, а не определенной высоты
Полность таск создания эталонных скриншотов выглядит так:
Запукается таск с помощью команды:
2.Такс создания новых скриншотов и их сравнения с эталонными
Как и в предыдущем таске, создаем необходимые каталоги или очищаем их от старых файлов:
Далее так же проходим массив страниц для создания новых страниц, но теперь и сравнивая их с эталонными
Код выше аналогичен созданию эталонных скриншотов, кроме дополнительного внесения каждого сделанного скриншота в массив img1
Далее с помощью функий parse2 мы вносим и эталонные скриншоты в массив img2, после сравниваем их с помощью фунции doneReading, полученный результат записывая в необходимый каталог:
Для дополнительного удобства, мы выводим все изображения сравненных страниц на одной странице и открываем ее в браузере.
Создадим переменную, которую будем использоват как модификатор в именах изображений и страниц для избежания кеширования в браузере:
Далее создаем список всех страниц с именем и изображением
И вносим созданный выше список в html файл
И в завершение создаем локальный сервер с этой страницей и открываем ее в браузере Google Chrome:
Полность таск создания новых скриншотов скриншотов и сравнениях их с эталонными выглядит так:
Запукается таск с помощью команды:
Обзор результатов
При совпадении новых скриншотов с эталонными, результат будет выглядеть подобным образом:
При несовпадении изображений(теста у эмелентов на странице Catalogue) разница будет выделена красным цветом:
Также можно изменить чувствительность сравнения изображений с помощью параметра threshold, он задается при вызове pixelmatch, может иметь значения от 0 до 1, где меньшее значение соответствует большей строгости сравнения.
В данном примере он вызывается внутри функции doneReading со значением threshold: 0.5