Screenshot Test — аутоматизована провера корисничког интерфејса путем снимања и поређења снимака екрана апликације са еталонским сликама. За разлику од golden тестова, screenshot тестови се извршавају на реалним уређајима или емулаторима, снимају пуне екране са навигацијом, системским елементима и анимацијама, и користе UI Automator (Android) или XCUITest (iOS) за интеракцију са апликацијом. Више пођединости — у документацији Android UI Automator.
Главно
Screenshot Test — то је end-to-end тестирање корисничког интерфејса, при чему тест отвара екран апликације, извршава акције (додири, унос текста, скроловање) и прави снимак добијеног стања. Снимак се пореди са еталоном (baseline) која се чува у репозиторијума. Ако се снимци разликују — тест пада. Screenshot тестови откривају визуелне регресије које нису видљиве у јединичним тестовима: погрешни размаки, преклапање елемената, погрешне боје.
Зашто су потребни screenshot тестови ако постоје golden тестови — golden тестови проверавају компоненте изоловано: један дугме, једна картица, један текст. Screenshot тестови проверавају цео екран у окружењу максимално блиском производном: реална навигација, реални подаци (или максимално реалистични mockови), реални системски фонтови, реална статус трака. Само screenshot тест ће показати да се дугме преклапа преко другог елемента на реалном уређају.
Пословна вредност — према подацима Google (2023), визуелне грешке чине 15-25% свих грешака мобилних апликација. Screenshot тестови аутоматизују проверу визуелног квалитета, која се раније радила ручно од стране QA инжењера. Један screenshot тест замењује 5-10 минута ручног тестирања једног екрана. За апликацију са 50 екрана уштеда: 4-8 радних сати за један регресија пролаз. Screenshot тестови се исплаћују за 2-3 циклуса издавања.
Golden тестови су бржи и једноставнији: рендеровање компоненте у off-screen буферу траје милисекунде, не захтева уређај, стабилни су на CI. Screenshot тестови су реалистичнији: снимају реални екран са системским елементима, подржавају анимације и навигацију, раде на реалним уређајима. Избор зависи од циља: брза повратна информација за програмера (golden) или максимална реалистичност пре издавања (screenshot).
| Карактеристика | Screenshot Test | Golden Test |
|---|---|---|
| Брзина | 2-30 секунди | 50-200 мс |
| Реалистичност | Максимална (реални уређај) | Ограничена (off-screen) |
| Захтева уређај | Да (емулатор/физички) | Не (JVM, XCTest) |
| Анимације | Подржава | Не подржава |
| Навигација | Вишекорачни сценарији | Једна компонента |
| Flakiness | Висок (мрежа, тајминзи) | Средњи (GPU, фонтови) |
| Паралелизам | Device Farm (Firebase, AWS) | Вишенитни JVM/XCTest |
Golden + Screenshot — користите golden тестове за сваку UI компоненту у библиотеци компонената (Design System). 80% визуелних регресија се хвата на нивоу компонената. Screenshot тестови — за критичне корисничке путање: onboarding, пријава, платни ток, корпа. 20% регресија везаних за интеграцију компонената на реалном екрану хватају само screenshot тестови. У IT Sectr користимо однос 80/20: 400 golden + 100 screenshot.
Када screenshot тест није потребан — ако се екран састоји од статичког садржаја без интерактивности, golden тест компоненте пружа исти ниво провере по мањоћ цени. Ако се екран динамички мења (фед, чат), screenshot тест захтева сложену конфигурацију података и време чекања. У таквим случајевима користите screenshot за основно стање (празна листа, учитавање) и golden за појединачне картице у листи.
UI Automator — Android оквир за међуапликацијско UI тестирање. Омогућава снимање екрана путем UiDevice.takeScreenshot(). За разлику од Espresso (ради унутар једне апликације), UI Automator може да интерагира са системским дијалозима (дозволе, обавештења) и другим апликацијама. Screenshot тест на UI Automator: отворити апликацију, сачекати учитавање, направити снимак екрана, упоредити са еталоном.
class LoginScreenScreenshotTest {
@get:Rule
val rule = ComposeTestRule.createAndroidComposeRule<MainActivity>()
@Test
fun login_screen_default() {
val device = UiDevice.getInstance(
InstrumentationRegistry.getInstrumentation()
)
// Ждём загрузки экрана
IdlingRegistry.getInstance().waitForIdle()
// Делаем скриншот
val screenshot = device.takeScreenshot()
val golden = loadGolden("login_default.png")
// Сравниваем с эталоном
val diff = ImageComparator.compare(screenshot, golden)
assertTrue(diff.similarity > 0.98)
}
}
Firebase Test Lab — Google Cloud услуга за покретање инструменталних тестова на стотинама реалних уређаја паралелно. Screenshot тестови на Firebase Test Lab снимају екране на различитим уређајима (Pixel 7, Galaxy S24, Xiaomi 14) и пореде их са еталонима. Предност: један тест проверава UI на 20 уређаја за 10-15 минута. Недостатак: цена ($1-5 по тесту на 20 уређаја). Firebase Test Lab се интегрише са CI путем gcloud CLI или Gradle плагина.
Shot — библиотека за screenshot тестирање на Android-у, која олакшава креирање и поређење снимака екрана. Shot ради на бази Espresso и UI Automator, додајући управљање golden (креирање, ажурирање, брисање), поређење са прагом (пиксели или проценти) и генерисање HTML извештаја. Shot је погодан за пројекте који желе брзо да имплементирају screenshot тестирање без писања сопствене инфраструктуре за поређење слика.
XCUITest — Apple оквир за UI тестирање iOS, iPadOS и tvOS апликација. Screenshot тестови на XCUITest користе XCUIScreen.main.screenshot() за снимање екрана и XCAttachment за чување снимка. XCUITest симулира корисничке радње: tap, swipe, typeText, и прави снимке након сваког корака. У Xcode 16+ додата је уграђена подршка за поређење снимака екрана са еталонима путем XCTAttachment.
final class LoginScreenScreenshotTests: XCTestCase {
var app: XCUIApplication!
override func setUp() {
super.setUp()
app = XCUIApplication()
app.launch()
}
func test_login_initial_state() {
let loginButton = app.buttons["login_button"]
XCTAssertTrue(loginButton.exists)
// Делаем скриншот
let screenshot = app.screenshot()
let attachment = XCTAttachment(screenshot: screenshot)
attachment.name = "Login-Screen-Initial"
attachment.lifetime = .keepAlways
add(attachment)
// Сравнение с эталоном (требует XCTAttachment + golden)
assertScreenshot(
screenshot: screenshot,
goldenName: "login_initial_state"
)
}
}
Xcode Cloud — облачни CI од Apple-а за изградњу и тестирање iOS апликација. Xcode Cloud подржава покретање XCUITest тестова на симулаторима. Screenshot тестови се могу покретати на више симулатора паралелно (iPhone 15, iPhone 15 Pro Max, iPad Pro). Резултати: XCResult Bundle са прилозима. Xcode Cloud није уграђен у GitHub/GitLab — користите Xcode Cloud Webhooks за интеграцију. Алтернатива: GitHub Actions са macos-14 и xcodebuild.
Framework-и за поређење — iOSSnapshotTestCase (Uber) ради и за screenshot тестове ако се покрећE на симулатору. SwiftSnapshotTesting (pointfree) је више усмерен ка golden тестовима компонената. За screenshot тестове на iOS-у користите уграђене алате XCUITest + XCTAttachment + прилагођени ImageComparator (Pixelmator или AImage). На CI-у користите симулатор — на реалним уређајима screenshot тестови раде само кроз Device Farm (AWS Device Farm).
Управљање baseline-ом — еталонски снимци се чувају у репозиторијуму (Git LFS) или S3. Сваки снимак се именује према шаблону: {testName}_{device}_{orientation}_{locale}.png. Примјер: loginScreenPixel7PortraitRu.png. При додавању новог уређаја или locale-а креира се нови baseline. При промени UI стари baseline-и се замењују новима након code review-а. Baseline је део базе кода, као и извори тестова.
CI Pipeline — (1) Изградња апликације. (2) Покретање screenshot тестова на емулаторима/симулаторима. (3) Поређење снимака са baseline-ом. (4) Ако непоклапање — генерисање diff слике. (5) Отпремање diff артефаката (actual, expected, diff — три фајла). (6) Објављивање HTML извештаја са табелом резултата. (7) Ако је праг премашен — тест пада. (8) Reviewer прегледа diff артефакте и доноси одлуку: approve (ажурирање baseline) или reject (поправка кода).
Праг и толеранција — апсолутно поређење пиксел по пиксел је превише строго. Користите SSIM (Structural Similarity Index) или MSE (Mean Squared Error). SSIM 0.98 = 98% структурне сличности — добар праг. За различите екране могу бити потребни различити прагови: тамна тема (више црног — већа прецизност), градијенти (више шума — мања прецизност). Праг подешавајте per-test путем параметра: @ScreenshotTest(threshold = 0.99).
Device Farm vs Simulator — тестови на реалним уређајима (Firebase Test Lab, AWS Device Farm) пружају максималну реалистичност, али су спори и скупи. Тестови на симулаторима/емулаторима — брзи и бесплатни, али не приказују карактеристике реалних уређаја (различити GPU, приказ боја екрана, густина пиксела). Стратегија: симулатор за pre-merge проверу (5 минута), Device Farm за nightly (30 минута, 20 уређаја). У IT Sectr користимо Firebase Test Lab за ноћне проласке на најбољих 10 Android уређаја.
Често постављана питања
Golden Test — за брзу проверу појединачних UI компонената при сваком комиту (50-200 мс). Screenshot Test — за E2E проверу целих екрана на реалним уређајима пре издавања (2-30 секунди). Користите оба: golden за Design System компоненте, screenshot за критичне корисничке путање. Однос 80/20 је оптималан за већину пројеката.
SSIM 0.98 — добар почетни праг за већину екрана. За тамну тему може 0.99 (већи контраст — прецизније поређење). За екране са градијентима и сликама — 0.95-0.97. Не користите апсолутно поређење пиксел по пиксел (MSE = 0) — оно даје 20-30% лажних пропада због anti-aliasing-а и разлика у GPU. Праг подешавајте индивидуално за сваки тест.
При свакој намјерној промени UI — промени боја, фонтова, размака, иконица, додавању/уклањању елемената. Не ажурирајте baseline при промени окружења (верзија OS, фонтови на CI) — то је знак flaky теста. Baseline се ажурира само локално од стране програмера након code review-а: обрисао стари baseline, покренуо тестове са record=true, проверио нове снимке, комитовао.
Да — путем Espresso на Android-у и XCUITest на iOS-у. Espresso ради унутар процеса апликације и не захтева Accessibility Service (као UI Automator). XCUITest — стандардни Apple оквир за UI тестове. За screenshot тестове разлика је минимална: XCUITest је мало стабилнији (изворни Apple API), UI Automator је мало флексибилнији (међупроцесна комуникација).
Ако су правилно подешени — не. Pre-merge: покрећите само screenshot тестове на измењеним екранима (30-60 секунди). Nightly: пун пролаз на Device Farm (30 минута, 20 уређаја). Време извршавања screenshot тестова на емулатору: 2-10 секунди по екрану. 20 екрана = 40-200 секунди. То је мање од времена ручног тестирања једног екрана (5-10 минута).
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође