Про Compose Preview Screenshot Testing
QArelia | Blog about QA 🧩Краткий рассказ, как я игрался с Compose Preview Screenshot Testing.
Он нужен для тестирования изменений вёрстки. С помощью него можно:
- определять Preview, которые будут тестироваться, в новой папке screenshotTest
- генерировать эталонные скриншоты, которые в дальнейшем будут использоваться для сравнения
- генерировать HTML отчёт, на котором будет виден diff сравнения двух скриншотов
Основной флоу
Для генерации эталонных скриншотов я запустил таску:
./gradlew updateDebugScreenshotTest
В итоге получил папку с эталонными скриншотами по адресу /app/src/debug/screenshotTest/reference/com/example/testscreenshotcompose/ExamplePreviewScreenshots
Теперь самое интересное - меняем код)) Просто разрабатываете дальше своё приложение, потом запускаете тесты таской:
./gradlew validateDebugScreenshotTest
Я пробовал на простых примерах, где поменял только текст и при этом превью не изменила свой размер. Тест упал, что логично, diff сгенерился, всё наглядно и понятно можно увидеть в отчёте:

Но что, если по размерами картинки будут разными?
В Diff получим такое сообщение:
Size Mismatch. Reference image size: 279X554. Rendered image size: 557X554

В целом логично, кажется, что если размеры превьюшек не совпадают, то это уже баг.
Если скриншоты совпадают, тест будет зелёным, Diff будет содержать надпись "Images match!":

Обновления
Пока я игрался, они уже выпустили апдейт в 0.0.1-alpha06. В нём добавлена настройка imageDifferenceThreshold для выставления порогового значения, выше которого тест будет падать:
android {
...
testOptions {
...
screenshotTests {
imageDifferenceThreshold = 0.0001f // 0.01%
}
}
}
К примеру, если процент изменений ниже этого значения, то тест не упадёт, но diff будет показан всё равно:

Что на мой взгляд можно улучшить:
- добавить сравнение через "наложение", как это реализовано, к примеру в Allure Screen Diff плагине:

- нужна таска на перегенерацию эталонных скриншотов, так как чтоб создать их заново, нужно удалять папку с эталонными скриншотами