Screenshot Test — istifadəçi interfeysinin avtomatlaşdırılmış yoxlanması, tətbiq ekranlarının ekran görüntülərinin ətalon şəkillərlə müqayisəsi yolu ilə həyata keçirilir. Golden testlərdən fərqli olaraq, screenshot testləri real cihazlarda və ya emulyatorlarda yerinə yetirilir, naviqasiya, sistem elementləri və animasiyalarla tam ekranları çəkir və tətbiqlə qarşılıqlı əlaqə üçün UI Automator (Android) və ya XCUITest (iOS) istifadə edir. Ətraflı — Android UI Automator sənədləşdirməsində.
Əsas məqamlar
Screenshot Test — istifadəçi interfeysinin end-to-end testidir, burada test tətbiqin ekranını açır, əməliyyatlar yerinə yetirir (toxunma, mətn daxil etmə, sürüşdürmə) və alınan vəziyyətin ekran görüntüsünü çəkir. Ekran görüntüsü depozitoridə saxlanılan ətalon (baseline) ilə müqayisə edilir. Ekran görüntüləri fərqlənirsə — test uğursuz olur. Screenshot testləri vahid testlərdə görünməyən vizual reqressiyaları aşkarlayır: səhv boşluqlar, elementlərin üst-üstə düşməsi, səhv rənglər.
Golden testlər varsa, screenshot testləri nə üçün lazımdır — golden testləri komponentləri təcrid olunmuş şəkildə yoxlayır: bir düymə, bir kart, bir mətn. Screenshot testləri istehsala mümkün qədər yaxın mühitdə tam ekranı yoxlayır: real naviqasiya, real məlumatlar (və ya maksimum realistmoklar), real sistem şriftləri, real status paneli. Yalnız screenshot testi real cihazda düymənin başqa elementlə üst-üstə düşdüyünü göstərə bilər.
Biznes dəyəri — Google (2023) məlumatlarına görə, vizual xətalar mobil tətbiq xətalarının 15-25%-ni təşkil edir. Screenshot testləri əvvəllər QA mühəndisləri tərəfindən əl ilə edilən vizual keyfiyyət yoxlamasını avtomatlaşdırır. Bir screenshot testi bir ekranın əl ilə test edilməsinin 5-10 dəqiqəsini əvəz edir. 50 ekranlı tətbiq üçün qənaət: bir reqressiya qaçışı üçün 4-8 adam-saat. Screenshot testləri 2-3 buraxılış dövründə özünü doğruldur.
Golden testlər daha sürətli və sadədir: komponentin off-screen buferdə render edilməsi millisaniyələr çəkir, cihaz tələb etmir, CI-da sabitdir. Screenshot testləri daha realistdir: sistem elementləri ilə real ekranı çəkir, animasiyaları və naviqasiyanı dəstəkləyir, real cihazlarda işləyir. Seçim məqsəddən asılıdır: tərtibatçı üçün sürətli geribildirim (golden) və ya buraxılışdan əvvəl maksimum realizm (screenshot).
| Xarakteristika | Screenshot Test | Golden Test |
|---|---|---|
| Sürət | 2-30 saniyə | 50-200 ms |
| Realizm | Maksimum (real cihaz) | Məhdud (off-screen) |
| Cihaz tələb edir | Bəli (emulyator/fiziki) | Xeyr (JVM, XCTest) |
| Animasiyalar | Dəstəkləyir | Dəstəkləmir |
| Naviqasiya | Çoxaddımlı ssenarilər | Bir komponent |
| Flakiness | Yüksək (şəbəkə, vaxtlama) | Orta (GPU, şriftlər) |
| Paralellik | Device Farm (Firebase, AWS) | Çoxiplikli JVM/XCTest |
Golden + Screenshot — komponent kitabxanasında (Design System) hər UI komponenti üçün golden testlərindən istifadə edin. Vizual reqressiyaların 80%-ı komponent səviyyəsində tutulur. Screenshot testləri — kritik istifadəçi yolları üçün: onboarding, giriş, ödəniş axını, səbət. Komponentlərin real ekranda inteqrasiyası ilə bağlı reqressiyaların 20%-ı yalnız screenshot testləri ilə tutulur. IT Sectr-də 80/20 nisbətindən istifadə edirik: 400 golden + 100 screenshot.
Screenshot testi nə vaxt lazım deyil — ekran interaktivlik olmadan statik məzmundan ibarətdirsə, komponentin golden testi eyni yoxlama səviyyəsini daha aşağı qiymətə verir. Ekran dinamik dəyişirsə (lent, söhbət), screenshot testi mürəkkəb məlumat konfiqurasiyası və gözləmə müddəti tələb edir. Belə hallarda əsas vəziyyət üçün screenshot (boş siyahı, yükləmə) və siyahıdakı ayrı-ayrı kartlar üçün golden istifadə edin.
UI Automator — tətbiqlərarası UI testi üçün Android çərçivəsi. UiDevice.takeScreenshot() vasitəsilə ekran görüntüləri çəkməyə imkan verir. Espresso-dan fərqli olaraq (bir tətbiq daxilində işləyir), UI Automator sistem dialogları (icazələr, bildirişlər) və digər tətbiqlərlə qarşılıqlı əlaqə qura bilər. UI Automator-da screenshot testi: tətbiqi açmaq, yüklənməni gözləmək, ekran görüntüsü çəkmək, ətalonla müqayisə etmək.
class LoginScreenScreenshotTest {
@get:Rule
val rule = ComposeTestRule.createAndroidComposeRule<MainActivity>()
@Test
fun login_screen_default() {
val device = UiDevice.getInstance(
InstrumentationRegistry.getInstrumentation()
)
// Ekranın yüklənməsini gözləyirik
IdlingRegistry.getInstance().waitForIdle()
// Ekran görüntüsü çəkirik
val screenshot = device.takeScreenshot()
val golden = loadGolden("login_default.png")
// Referansla müqayisə edirik
val diff = ImageComparator.compare(screenshot, golden)
assertTrue(diff.similarity > 0.98)
}
}
Firebase Test Lab — yüzlərlə real cihazda paralel olaraq instrumental testləri işə salmaq üçün Google Cloud xidməti. Firebase Test Lab-da screenshot testləri müxtəlif cihazlarda (Pixel 7, Galaxy S24, Xiaomi 14) ekran görüntüləri çəkir və ətalonlarla müqayisə edir. Üstünlük: bir test 10-15 dəqiqə ərzində 20 cihazda UI yoxlayır. Çatışmazlıq: dəyəri (20 cihazda bir test üçün $1-5). Firebase Test Lab CI ilə gcloud CLI və ya Gradle plugin vasitəsilə inteqrasiya olunur.
Shot — Android-də screenshot testi üçün kitabxana, ekran görüntülərinin yaradılmasını və müqayisəsini asanlaşdırır. Shot Espresso və UI Automator üzərində işləyir, golden idarəetmə (yaratma, yeniləmə, silmə), hədd (piksel və ya faiz) ilə müqayisə və HTML hesabatının yaradılmasını əlavə edir. Shot öz şəkil müqayisə infrastrukturunu yazmadan screenshot testini tez tətbiq etmək istəyən layihələr üçün uyğundur.
XCUITest — iOS, iPadOS və tvOS tətbiqlərinin UI testi üçün Apple çərçivəsi. XCUITest-də screenshot testləri ekranı çəkmək üçün XCUIScreen.main.screenshot() və ekran görüntüsünü saxlamaq üçün XCAttachment istifadə edir. XCUITest istifadəçi hərəkətlərini simulyasiya edir: tap, swipe, typeText və hər addımdan sonra ekran görüntüləri çəkir. Xcode 16+-da XCTAttachment vasitəsilə ekran görüntülərinin ətalonlarla müqayisəsi üçün daxili dəstək əlavə edilib.
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)
// Ekran görüntüsü çəkirik
let screenshot = app.screenshot()
let attachment = XCTAttachment(screenshot: screenshot)
attachment.name = "Login-Screen-Initial"
attachment.lifetime = .keepAlways
add(attachment)
// Referansla müqayisə (XCTAttachment + golden tələb edir)
assertScreenshot(
screenshot: screenshot,
goldenName: "login_initial_state"
)
}
}
Xcode Cloud — iOS tətbiqlərinin qurulması və testi üçün Apple-dan bulud CI xidməti. Xcode Cloud simulyatorlarda XCUITest testlərinin işə salınmasını dəstəkləyir. Screenshot testləri bir neçə simulyatorda paralel işə salına bilər (iPhone 15, iPhone 15 Pro Max, iPad Pro). Nəticələr: əlavələrlə XCResult Bundle. Xcode Cloud GitHub/GitLab-a daxil deyil — inteqrasiya üçün Xcode Cloud Webhooks istifadə edin. Alternativ: macos-14 və xcodebuild ilə GitHub Actions.
Müqayisə çərçivələri — iOSSnapshotTestCase (Uber) simulyatorda işə salındıqda screenshot testləri üçün də işləyir. SwiftSnapshotTesting (pointfree) daha çox komponentlərin golden testlərinə yönəlib. iOS-da screenshot testləri üçün daxili XCUITest + XCTAttachment + xüsusi ImageComparator (Pixelmator və ya AImage) istifadə edin. CI-da simulyatordan istifadə edin — real cihazlarda screenshot testləri yalnız Device Farm (AWS Device Farm) vasitəsilə işləyir.
Baseline idarəetməsi — ətalon ekran görüntüləri depozitoridə (Git LFS) və ya S3-də saxlanılır. Hər ekran görüntüsü şablon üzrə adlandırılır: {testName}_{device}_{orientation}_{locale}.png. Nümunə: loginScreenPixel7PortraitRu.png. Yeni cihaz və ya locale əlavə edildikdə yeni baseline yaradılır. UI dəyişdirildikdə köhnə baseline code review-dən sonra yeniləri ilə əvəz olunur. Baseline test mənbələri kimi kod bazasının bir hissəsidir.
CI Pipeline — (1) Tətbiqin qurulması. (2) Emulyatorlarda/simulyatorlarda screenshot testlərinin işə salınması. (3) Ekran görüntülərinin baseline ilə müqayisəsi. (4) Uyğunsuzluq halında — diff şəklinin yaradılması. (5) Diff-artefaktlarının yüklənməsi (actual, expected, diff — üç fayl). (6) Nəticə cədvəli ilə HTML hesabatının dərc edilməsi. (7) Hədd keçilibsə — test uğursuz olur. (8) Rəyçi diff-artefaktlarına baxır və qərar verir: təsdiq (baseline yenilənməsi) və ya rədd (kodun düzəldilməsi).
Hədd və tolerantlıq — mütləq pikselbapiksel müqayisə çox sərtdir. SSIM (Structural Similarity Index) və ya MSE (Mean Squared Error) istifadə edin. SSIM 0.98 = 98% struktur oxşarlığı — yaxşı hədd. Müxtəlif ekranlar üçün fərqli hədd tələb oluna bilər: qaranlıq tema (daha çox qara — daha yüksək dəqiqlik), gradientlər (daha çox səs — aşağı dəqiqlik). Həddi parametr vasitəsilə testbazında konfiqurasiya edin: @ScreenshotTest(threshold = 0.99).
Device Farm vs Simulyator — real cihazlarda testlər (Firebase Test Lab, AWS Device Farm) maksimum realizm verir, lakin yavaş və pulludur. Simulyatorlarda/emulyatorlarda testlər — sürətli və pulsuzdur, lakin real cihaz xüsusiyyətlərini göstərmir (müxtəlif GPU, ekran rəng ötürücülüyü, piksel sıxlığı). Strategiya: pre-merge yoxlaması üçün simulyator (5 dəqiqə), nightly üçün Device Farm (30 dəqiqə, 20 cihaz). IT Sectr-də gecə qaçışları üçün top-10 Android cihazında Firebase Test Lab istifadə edirik.
Tez-tez verilən suallar
Golden Test — hər kommitdə ayrı-ayrı UI komponentlərinin sürətli yoxlanması üçün (50-200 ms). Screenshot Test — buraxılışdan əvvəl real cihazlarda tam ekranların E2E yoxlanması üçün (2-30 saniyə). Hər ikisindən istifadə edin: Design System komponentləri üçün golden, kritik istifadəçi yolları üçün screenshot. 80/20 nisbəti əksər layihələr üçün optimaldır.
SSIM 0.98 — əksər ekranlar üçün yaxşı başlanğıc həddi. Qaranlıq tema üçün 0.99 istifadə edilə bilər (daha yüksək kontrast — daha dəqiq müqayisə). Qradientlər və şəkillər olan ekranlar üçün — 0.95-0.97. Mütləq pikselbapiksel müqayisədən (MSE = 0) istifadə etməyin — anti-aliasing və GPU fərqləri səbəbindən 20-30% yalan pozitiv verir. Hər test üçün həddi fərdi konfiqurasiya edin.
Hər qəsdən UI dəyişikliyində — rənglərin, şriftlərin, boşluqların, ikonların dəyişməsi, elementlərin əlavə edilməsi/silinməsi. Mühit dəyişikliyi zamanı (OS versiyası, CI şriftləri) baseline yeniləməyin — bu flaky test əlamətidir. Baseline yalnız local olaraq tərtibatçı tərəfindən code review-dən sonra yenilənir: köhnə baseline silindi, record=true ilə testlər işə salındı, yeni ekran görüntüləri yoxlanıldı, commit edildi.
Bəli — Android-də Espresso və iOS-da XCUITest vasitəsilə. Espresso tətbiq prosesi daxilində işləyir və Accessibility Service tələb etmir (UI Automator kimi). XCUITest — UI testləri üçün standart Apple çərçivəsi. Screenshot testləri üçün fərq minimaldır: XCUITest bir qədər sabitdir (doğma Apple API), UI Automator bir qədər çevikdir (proseslərarası qarşılıqlı əlaqə).
Düzgün konfiqurasiya olunarsa — yox. Pre-merge: yalnız dəyişdirilmiş ekranlarda screenshot testlərini işə salın (30-60 saniyə). Nightly: Device Farm-da tam qaçış (30 dəqiqə, 20 cihaz). Emulyatorda screenshot testlərinin icra müddəti: ekran başına 2-10 saniyə. 20 ekran = 40-200 saniyə. Bu, bir ekranın əl ilə test edilmə müddətindən (5-10 dəqiqə) azdır.
Nəticələr
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun