Screenshot Test — foydalanuvchi interfeysini avtomatik tekshirish, bunda ilova ekranlarining skrinshotlari etalon tasvirlar bilan solishtiriladi. Golden testlardan farqli o‘laroq, screenshot testlari real qurilmalarda yoki emulyatorlarda bajariladi, navigatsiya, tizim elementlari va animatsiyalar bilan to‘liq ekranlarni oladi va ilova bilan o‘zaro aloqa qilish uchun UI Automator (Android) yoki XCUITest (iOS) dan foydalanadi. Batafsil — Android UI Automator hujjatlarida.
Asosiy
Screenshot Test — bu foydalanuvchi interfeysining end-to-end testi bo‘lib, unda test ilova ekranini ochadi, harakatlarni bajaradi (bosish, matn kiritish, aylantirish) va olingan holatning skrinshotini oladi. Skrinshot repozitariyda saqlanadigan etalon (baseline) bilan solishtiriladi. Agar skrinshotlar farq qilsa — test muvaffaqiyatsiz bo‘ladi. Screenshot testlari birlik testlarida ko‘rinmaydigan vizual regressiyalarni aniqlaydi: noto‘g‘ri chekinishlar, elementlarning ustma-ust tushishi, noto‘g‘ri ranglar.
Nima uchun golden testlar mavjud bo‘lsa ham screenshot testlari kerak — golden testlari komponentlarni izolyatsiya qilingan holda tekshiradi: bitta tugma, bitta karta, bitta matn. Screenshot testlari butun ekranni ishlab chiqarishga maksimal yaqin muhitda tekshiradi: real navigatsiya, real ma’lumotlar (yoki maksimal realistik moklar), real tizim shriftlari, real holat paneli. Faqat screenshot testi real qurilmada tugmaning boshqa element bilan ustma-ust tushishini ko‘rsata oladi.
Biznes qiymati — Google (2023) ma’lumotlariga ko‘ra, vizual xatolar mobil ilova xatolarining 15-25% ini tashkil qiladi. Screenshot testlari ilgari QA muhandislari tomonidan qo‘lda bajarilgan vizual sifat tekshiruvini avtomatlashtiradi. Bitta screenshot testi bitta ekranni qo‘lda test qilishning 5-10 daqiqasini o‘rnini bosadi. 50 ekranli ilova uchun tejash: bitta regressiya o‘tishi uchun 4-8 kishi-soat. Screenshot testlari 2-3 reliz siklida o‘zini oqlaydi.
Golden testlari tezroq va soddaroq: komponentni off-screen buferda render qilish millisoniyalar davom etadi, qurilma talab qilmaydi, CI da barqaror. Screenshot testlari realistikroq: tizim elementlari bilan real ekranni oladi, animatsiyalar va navigatsiyani qo‘llab-quvvatlaydi, real qurilmalarda ishlaydi. Tanlov maqsadga bog‘liq: dasturchi uchun tez fikr-mulohaza (golden) yoki relizdan oldin maksimal realizm (screenshot).
| Xarakteristika | Screenshot Test | Golden Test |
|---|---|---|
| Tezlik | 2-30 soniya | 50-200 ms |
| Realizm | Maksimal (real qurilma) | Cheklangan (off-screen) |
| Qurilma talab qiladi | Ha (emulyator/fizik) | Yo‘q (JVM, XCTest) |
| Animatsiyalar | Qo‘llab-quvvatlaydi | Qo‘llab-quvvatlamaydi |
| Navigatsiya | Ko‘p bosqichli ssenariylar | Bitta komponent |
| Flakiness | Yuqori (tarmoq, vaqtlash) | O‘rta (GPU, shriftlar) |
| Parallellik | Device Farm (Firebase, AWS) | Ko‘p oqimli JVM/XCTest |
Golden + Screenshot — komponentlar kutubxonasidagi (Design System) har bir UI komponenti uchun golden testlaridan foydalaning. Vizual regressiyalarning 80% komponent darajasida ushlanadi. Screenshot testlari — muhim foydalanuvchi yo‘llari uchun: onboarding, kirish, to‘lov oqimi, savat. Komponentlarning real ekranda integratsiyasi bilan bog‘liq 20% regressiyalar faqat screenshot testlari bilan ushlanadi. IT Sectr da 80/20 nisbatidan foydalanamiz: 400 golden + 100 screenshot.
Qachon screenshot testi kerak emas — agar ekran interaktivliksiz statik tarkibdan iborat bo‘lsa, komponentning golden testi bir xil tekshirish darajasini arzonroq narxda beradi. Agar ekran dinamik o‘zgarsa (lenta, chat), screenshot testi murakkab ma’lumot konfiguratsiyasi va kutish vaqtini talab qiladi. Bunday hollarda asosiy holat uchun screenshot (bo‘sh ro‘yxat, yuklash) va ro‘yxatdagi alohida kartalar uchun golden dan foydalaning.
UI Automator — ilovalararo UI testi uchun Android frameworki. UiDevice.takeScreenshot() orqali skrinshot olish imkonini beradi. Espresso dan farqli o‘laroq (bitta ilova ichida ishlaydi), UI Automator tizim dialoglari (ruxsatlar, bildirishnomalar) va boshqa ilovalar bilan o‘zaro aloqa qila oladi. UI Automator da screenshot testi: ilovani ochish, yuklanishni kutish, skrinshot olish, etalon bilan solishtirish.
class LoginScreenScreenshotTest {
@get:Rule
val rule = ComposeTestRule.createAndroidComposeRule<MainActivity>()
@Test
fun login_screen_default() {
val device = UiDevice.getInstance(
InstrumentationRegistry.getInstrumentation()
)
// Ekran yuklanishini kutamiz
IdlingRegistry.getInstance().waitForIdle()
// Skrinshot olamiz
val screenshot = device.takeScreenshot()
val golden = loadGolden("login_default.png")
// Etalon bilan solishtiramiz
val diff = ImageComparator.compare(screenshot, golden)
assertTrue(diff.similarity > 0.98)
}
}
Firebase Test Lab — yuzlab real qurilmalarda parallel instrumental testlarni ishga tushirish uchun Google Cloud xizmati. Firebase Test Lab da screenshot testlari turli qurilmalarda (Pixel 7, Galaxy S24, Xiaomi 14) skrinshotlarni oladi va ularni etalonlar bilan solishtiradi. Afzallik: bitta test 20 qurilmada 10-15 daqiqada UI ni tekshiradi. Kamchilik: narxi (20 qurilma uchun $1-5). Firebase Test Lab CI bilan gcloud CLI yoki Gradle plagini orqali integratsiyalanadi.
Shot — Android da screenshot testi uchun kutubxona, skrinshotlarni yaratish va solishtirishni osonlashtiradi. Shot Espresso va UI Automator asosida ishlaydi, golden boshqaruvi (yaratish, yangilash, o‘chirish), chegara (piksel yoki foiz) bilan solishtirish va HTML hisobotini yaratishni qo‘shadi. Shot o‘z tasvir solishtirish infratuzilmasini yozmasdan screenshot testini tez joriy qilishni xohlovchi loyihalar uchun mos keladi.
XCUITest — iOS, iPadOS va tvOS ilovalarini UI testi uchun Apple frameworki. XCUITest da screenshot testlari ekranni olish uchun XCUIScreen.main.screenshot() va skrinshotni saqlash uchun XCAttachment dan foydalanadi. XCUITest foydalanuvchi harakatlarini simulyatsiya qiladi: tap, swipe, typeText va har qadamdan so‘ng skrinshot oladi. Xcode 16+ da XCTAttachment orqali skrinshotlarni etalonlar bilan solishtirish uchun o‘rnatilgan qo‘llab-quvvatlash qo‘shilgan.
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)
// Skrinshot olamiz
let screenshot = app.screenshot()
let attachment = XCTAttachment(screenshot: screenshot)
attachment.name = "Login-Screen-Initial"
attachment.lifetime = .keepAlways
add(attachment)
// Etalon bilan solishtirish (XCTAttachment + golden talab qiladi)
assertScreenshot(
screenshot: screenshot,
goldenName: "login_initial_state"
)
}
}
Xcode Cloud — Apple dan iOS ilovalarini qurish va test qilish uchun bulutli CI. Xcode Cloud simulyatorlarda XCUITest testlarini ishga tushirishni qo‘llab-quvvatlaydi. Screenshot testlari bir nechta simulyatorda parallel ishga tushirilishi mumkin (iPhone 15, iPhone 15 Pro Max, iPad Pro). Natijalar: qo‘shimchalar bilan XCResult Bundle. Xcode Cloud GitHub/GitLab ga o‘rnatilmagan — integratsiya uchun Xcode Cloud Webhooks dan foydalaning. Muqobil: macos-14 va xcodebuild bilan GitHub Actions.
Solishtirish frameworklari — iOSSnapshotTestCase (Uber) simulyatorda ishga tushirilsa, screenshot testlari uchun ham ishlaydi. SwiftSnapshotTesting (pointfree) ko‘proq komponentlarning golden testlariga yo‘naltirilgan. iOS da screenshot testlari uchun o‘rnatilgan XCUITest + XCTAttachment + maxsus ImageComparator (Pixelmator yoki AImage) dan foydalaning. CI da simulyatordan foydalaning — real qurilmalarda screenshot testlari faqat Device Farm (AWS Device Farm) orqali ishlaydi.
Baseline boshqaruvi — etalon skrinshotlar repozitariyda (Git LFS) yoki S3 da saqlanadi. Har bir skrinshot shablon bo‘yicha nomlanadi: {testName}_{device}_{orientation}_{locale}.png. Misol: loginScreenPixel7PortraitRu.png. Yangi qurilma yoki locale qo‘shilganda, yangi baseline yaratiladi. UI o‘zgartirilganda, eski baseline lar code review dan so‘ng yangilari bilan almashtiriladi. Baseline test manbalari kabi kod bazasining bir qismidir.
CI Pipeline — (1) Ilovani qurish. (2) Emulyatorlarda/simulyatorlarda screenshot testlarini ishga tushirish. (3) Skrinshotlarni baseline bilan solishtirish. (4) Nomuvofiqlik bo‘lsa — diff tasvirini yaratish. (5) Diff-artefaktlarni yuklash (actual, expected, diff — uchta fayl). (6) Natijalar jadvali bilan HTML hisobotini nashr qilish. (7) Agar chegara oshib ketgan bo‘lsa — test muvaffaqiyatsiz bo‘ladi. (8) Sharhlovchi diff-artefaktlarni ko‘rib chiqadi va qaror qabul qiladi: tasdiqlash (baseline ni yangilash) yoki rad etish (kodni tuzatish).
Chegara va tolerantlik — mutlaq pikselma-piksel solishtirish juda qattiq. SSIM (Structural Similarity Index) yoki MSE (Mean Squared Error) dan foydalaning. SSIM 0.98 = 98% strukturaviy o‘xshashlik — yaxshi chegara. Turli ekranlar uchun turli chegaralar kerak bo‘lishi mumkin: qorong‘u mavzu (ko‘proq qora — yuqori aniqlik), gradientlar (ko‘proq shovqin — past aniqlik). Chegarani per-test parametr orqali sozlang: @ScreenshotTest(threshold = 0.99).
Device Farm vs Simulyator — real qurilmalarda testlar (Firebase Test Lab, AWS Device Farm) maksimal realizm beradi, lekin sekin va pulli. Simulyatorlarda/emulyatorlarda testlar — tez va bepul, lekin real qurilma xususiyatlarini ko‘rsatmaydi (turli GPU, ekran rang uzatishi, piksel zichligi). Strategiya: pre-merge tekshiruvi uchun simulyator (5 daqiqa), Device Farm nightly uchun (30 daqiqa, 20 qurilma). IT Sectr da tungi o‘tishlar uchun eng yaxshi 10 Android qurilmasida Firebase Test Lab dan foydalanamiz.
Tez-tez so‘raladigan savollar
Golden Test — har bir kommitda alohida UI komponentlarini tez tekshirish uchun (50-200 ms). Screenshot Test — relizdan oldin real qurilmalarda butun ekranlarni E2E tekshirish uchun (2-30 soniya). Ikkalasidan foydalaning: Design System komponentlari uchun golden, muhim foydalanuvchi yo‘llari uchun screenshot. 80/20 nisbati ko‘pchilik loyihalar uchun optimaldir.
SSIM 0.98 — ko‘pchilik ekranlar uchun yaxshi boshlang‘ich chegara. Qorong‘u mavzu uchun 0.99 dan foydalanish mumkin (yuqori kontrast — aniqroq solishtirish). Gradient va tasvirlar bilan ekranlar uchun — 0.95-0.97. Mutlaq pikselma-piksel solishtirishdan (MSE = 0) foydalanmang — anti-aliasing va GPU farqlari tufayli 20-30% noto‘g‘ri musbat natijalar beradi. Chegarani har bir test uchun individual sozlang.
Har bir ataylab UI o‘zgarishida — ranglar, shriftlar, chekinishlar, belgilar o‘zgarishi, elementlarni qo‘shish/o‘chirish. Muhit o‘zgarishida (OS versiyasi, CI shriftlari) baseline ni yangilamang — bu flaky test belgisi. Baseline faqat dasturchi tomonidan code review dan so‘ng lokal yangilanadi: eski baseline o‘chirildi, record=true bilan testlar ishga tushirildi, yangi skrinshotlar tekshirildi, commit qilindi.
Ha — Android da Espresso va iOS da XCUITest orqali. Espresso ilova jarayoni ichida ishlaydi va Accessibility Service ni talab qilmaydi (UI Automator kabi). XCUITest — UI testlari uchun standart Apple frameworki. Screenshot testlari uchun farq minimal: XCUITest biroz barqarorroq (mahalliy Apple API), UI Automator biroz moslashuvchanroq (jarayonlararo aloqa).
To‘g‘ri sozlangan bo‘lsa — yo‘q. Pre-merge: faqat o‘zgartirilgan ekranlarda screenshot testlarini ishga tushiring (30-60 soniya). Nightly: Device Farm da to‘liq o‘tish (30 daqiqa, 20 qurilma). Emulyatorda screenshot testlarining bajarilish vaqti: har bir ekran uchun 2-10 soniya. 20 ekran = 40-200 soniya. Bu bitta ekranni qo‘lda test qilish vaqtidan (5-10 daqiqa) kamroq.
Xulosalar
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.