Screenshot Test, uygulama ekranlarının ekran görüntülerini yakalayıp referans görsellerle karşılaştırarak kullanıcı arayüzünün otomatik olarak kontrol edilmesidir. Golden testlerin aksine, screenshot testler gerçek cihazlarda veya emülatörlerde gerçekleştirilir, navigasyon, sistem öğeleri ve animasyonlarla birlikte tam ekranları yakalar ve uygulamayla etkileşim için UI Automator (Android) veya XCUITest (iOS) kullanır. Daha fazla detay için Android UI Automator dokümantasyonuna bakın.
Ana Noktalar
Screenshot Test, testin bir uygulama ekranını açtığı, eylemler gerçekleştirdiği (dokunma, metin girişi, kaydırma) ve sonuç durumunun ekran görüntüsünü aldığı uçtan uca bir kullanıcı arayüzü testidir. Ekran görüntüsü, depoda saklanan bir referans (baseline) ile karşılaştırılır. Ekran görüntüleri farklıysa — test başarısız olur. Screenshot testler, birim testlerin göremediği görsel regresyonları tespit eder: yanlış kenar boşlukları, örtüşen öğeler, yanlış renkler.
Golden testlerimiz varken neden screenshot testlere ihtiyaç duyuyoruz? — golden testler bileşenleri izole olarak kontrol eder: bir düğme, bir kart, bir metin. Screenshot testler, üretime mümkün olduğunca yakın bir ortamda tüm bir ekranı kontrol eder: gerçek navigasyon, gerçek veriler (veya maksimum gerçekçi mock’lar), gerçek sistem yazı tipleri, gerçek durum çubuğu. Yalnızca bir screenshot test, bir düğmenin gerçek bir cihazda başka bir öğeyle örtüştüğünü gösterecektir.
İş değeri — Google’a (2023) göre, görsel hatalar tüm mobil uygulama hatalarının %15-25’ini oluşturur. Screenshot testler, daha önce QA mühendisleri tarafından manuel olarak yapılan görsel kalite kontrolünü otomatikleştirir. Bir screenshot test, bir ekranın 5-10 dakikalık manuel testinin yerini alır. 50 ekranlı bir uygulama için tasarruf: regresyon çalıştırması başına 4-8 adam-saat. Screenshot testler 2-3 sürüm döngüsünde kendini amorti eder.
Golden testler daha hızlı ve basittir: bir bileşeni ekran dışı arabellekte işlemek milisaniyeler sürer, cihaz gerektirmez ve CI’da kararlıdır. Screenshot testler daha gerçekçidir: sistem öğeleriyle gerçek bir ekranı yakalar, animasyonları ve navigasyonu destekler ve gerçek cihazlarda çalışır. Seçim hedefe bağlıdır: geliştirici için hızlı geri bildirim (golden) veya sürümden önce maksimum gerçekçilik (screenshot).
| Özellik | Screenshot Test | Golden Test |
|---|---|---|
| Hız | 2-30 saniye | 50-200 ms |
| Gerçekçilik | Maksimum (gerçek cihaz) | Sınırlı (ekran dışı) |
| Cihaz gerekli | Evet (emülatör/fiziksel) | Hayır (JVM, XCTest) |
| Animasyonlar | Destekler | Desteklemez |
| Navigasyon | Çok adımlı senaryolar | Tek bileşen |
| Dengesizlik | Yüksek (ağ, zamanlama) | Orta (GPU, yazı tipleri) |
| Paralellik | Device Farm (Firebase, AWS) | Çok iş parçacıklı JVM/XCTest |
Golden + Screenshot — bileşen kitaplığındaki (Design System) her UI bileşeni için golden testler kullanın. Görsel regresyonların %80’i bileşen düzeyinde yakalanır. Screenshot testler — kritik kullanıcı yolları için: onboarding, giriş, ödeme akışı, alışveriş sepeti. Gerçek bir ekranda bileşen entegrasyonuyla ilgili regresyonların %20’si yalnızca screenshot testler tarafından yakalanır. IT Sectr’de 80/20 oranı kullanıyoruz: 400 golden + 100 screenshot.
Bir screenshot testin gerekli olmadığı durumlar — ekran etkileşimsiz statik içerikten oluşuyorsa, bir golden bileşen testi daha düşük maliyetle aynı düzeyde doğrulama sağlar. Ekran dinamik olarak değişiyorsa (besleme, sohbet), screenshot test karmaşık veri kurulumu ve bekleme süreleri gerektirir. Bu gibi durumlarda, temel durum için (boş liste, yükleme) screenshot ve listedeki tek tek kartlar için golden kullanın.
UI Automator, uygulamalar arası UI testi için bir Android framework’dür. UiDevice.takeScreenshot() aracılığıyla ekran görüntüsü almayı sağlar. Espresso’nun (tek bir uygulama içinde çalışır) aksine, UI Automator sistem diyalogları (izinler, bildirimler) ve diğer uygulamalarla etkileşime girebilir. UI Automator’da screenshot test: uygulamayı aç, yüklenmesini bekle, ekran görüntüsü al, referansla karşılaştır.
class LoginScreenScreenshotTest {
@get:Rule
val rule = ComposeTestRule.createAndroidComposeRule<MainActivity>()
@Test
fun login_screen_default() {
val device = UiDevice.getInstance(
InstrumentationRegistry.getInstrumentation()
)
// Ekranın yüklenmesini bekliyoruz
IdlingRegistry.getInstance().waitForIdle()
// Ekran görüntüsü alıyoruz
val screenshot = device.takeScreenshot()
val golden = loadGolden("login_default.png")
// Referansla karşılaştırıyoruz
val diff = ImageComparator.compare(screenshot, golden)
assertTrue(diff.similarity > 0.98)
}
}
Firebase Test Lab, yüzlerce gerçek cihazda paralel olarak enstrümente testler çalıştırmak için bir Google Cloud hizmetidir. Firebase Test Lab’deki screenshot testler, farklı cihazlarda (Pixel 7, Galaxy S24, Xiaomi 14) ekran görüntüleri yakalar ve referanslarla karşılaştırır. Avantaj: tek bir test, 20 cihazda 10-15 dakikada UI’yı kontrol eder. Dezavantaj: maliyet (20 cihazda test başına $1-5). Firebase Test Lab, gcloud CLI veya Gradle eklentisi aracılığıyla CI ile entegre olur.
Shot, Android’de screenshot testlerini basitleştiren bir kütüphanedir. Shot, Espresso ve UI Automator üzerinde çalışır, golden yönetimi (oluşturma, güncelleme, silme), eşikle karşılaştırma (piksel veya yüzde) ve HTML raporu oluşturma ekler. Shot, kendi görüntü karşılaştırma altyapısını yazmadan hızlıca screenshot test uygulamak isteyen projeler için uygundur.
XCUITest, iOS, iPadOS ve tvOS uygulamalarının UI testi için Apple’ın framework’üdür. XCUITest’teki screenshot testler, ekran yakalama için XCUIScreen.main.screenshot() ve ekran görüntülerini kaydetmek için XCAttachment kullanır. XCUITest, kullanıcı eylemlerini simüle eder: dokunma, kaydırma, typeText ve her adımdan sonra ekran görüntüsü alır. Xcode 16+ sürümünde, XCTAttachment aracılığıyla referanslarla ekran görüntüsü karşılaştırması için yerleşik destek eklendi.
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ü alıyoruz
let screenshot = app.screenshot()
let attachment = XCTAttachment(screenshot: screenshot)
attachment.name = "Login-Screen-Initial"
attachment.lifetime = .keepAlways
add(attachment)
// Referansla karşılaştırma (XCTAttachment + golden gerektirir)
assertScreenshot(
screenshot: screenshot,
goldenName: "login_initial_state"
)
}
}
Xcode Cloud, iOS uygulamalarını derlemek ve test etmek için Apple’ın bulut CI’sıdır. Xcode Cloud, simülatörlerde XCUITest testlerinin çalıştırılmasını destekler. Screenshot testler, birden çok simülatörde paralel olarak çalıştırılabilir (iPhone 15, iPhone 15 Pro Max, iPad Pro). Sonuçlar: eklerle birlikte XCResult Bundle. Xcode Cloud, GitHub/GitLab’e yerleşik değildir — entegrasyon için Xcode Cloud Webhooks kullanın. Alternatif: macos-14 ve xcodebuild ile GitHub Actions.
Karşılaştırma framework’leri — iOSSnapshotTestCase (Uber) bir simülatörde çalıştırıldığında screenshot testler için de çalışır. SwiftSnapshotTesting (pointfree) daha çok bileşen golden testlerine yöneliktir. iOS’ta screenshot testler için, yerleşik XCUITest araçlarını + XCTAttachment’ı + özel bir ImageComparator’ı (Pixelmator veya AImage) kullanın. CI’da simülatör kullanın — gerçek cihazlarda screenshot testler yalnızca Device Farm (AWS Device Farm) aracılığıyla çalışır.
Referans yönetimi — referans ekran görüntüleri depoda (Git LFS) veya S3’te saklanır. Her ekran görüntüsü şablona göre adlandırılır: {testName}_{device}_{orientation}_{locale}.png. Örnek: loginScreenPixel7PortraitRu.png. Yeni bir cihaz veya yerel ayar eklendiğinde, yeni bir referans oluşturulur. UI değiştirildiğinde, kod incelemesinden sonra eski referanslar yenileriyle değiştirilir. Referans, test kaynakları gibi kod tabanının bir parçasıdır.
CI Pipeline — (1) Uygulamayı derle. (2) Emülatörlerde/simülatörlerde screenshot testleri çalıştır. (3) Ekran görüntülerini referanslarla karşılaştır. (4) Uyuşmazlık durumunda — diff görseli oluştur. (5) Diff yapıtlarını yükle (actual, expected, diff — üç dosya). (6) Sonuç tablosuyla HTML raporu yayınla. (7) Eşik aşılırsa — test başarısız olur. (8) İnceleyici diff yapıtlarını inceler ve karar verir: onayla (referansı güncelle) veya reddet (kodu düzelt).
Eşik ve tolerans — piksel piksel mutlak karşılaştırma çok katıdır. SSIM (Yapısal Benzerlik İndeksi) veya MSE (Ortalama Karesel Hata) kullanın. SSIM 0.98 = %98 yapısal benzerlik — iyi bir eşik. Farklı ekranlar farklı eşikler gerektirebilir: koyu tema (daha fazla siyah — daha yüksek doğruluk), gradyanlar (daha fazla gürültü — daha düşük doğruluk). Parametre aracılığıyla test başına eşiği yapılandırın: @ScreenshotTest(threshold = 0.99).
Device Farm vs Simülatör — gerçek cihazlardaki testler (Firebase Test Lab, AWS Device Farm) maksimum gerçekçilik sağlar ancak yavaş ve ücretlidir. Simülatörlerdeki/emülatörlerdeki testler hızlı ve ücretsizdir ancak gerçek cihaz özelliklerini (farklı GPU’lar, ekran renk üretimi, piksel yoğunluğu) göstermez. Strateji: birleştirme öncesi kontrol için simülatör (5 dakika), gece testleri için Device Farm (30 dakika, 20 cihaz). IT Sectr’de en üst 10 Android cihazında gece çalıştırmaları için Firebase Test Lab kullanıyoruz.
Sıkça Sorulan Sorular
Golden Test — her commit’te tek tek UI bileşenlerinin hızlı doğrulanması için (50-200 ms). Screenshot Test — sürümden önce gerçek cihazlarda tüm ekranların E2E doğrulanması için (2-30 saniye). İkisini de kullanın: Design System bileşenleri için golden, kritik kullanıcı yolları için screenshot. Çoğu proje için 80/20 oranı idealdir.
SSIM 0.98 çoğu ekran için iyi bir başlangıç eşiğidir. Koyu tema için 0.99 kullanabilirsiniz (daha yüksek kontrast — daha doğru karşılaştırma). Gradyanlar ve görseller içeren ekranlar için — 0.95-0.97. Piksel piksel mutlak karşılaştırma (MSE = 0) kullanmayın — kenar yumuşatma ve GPU farklılıkları nedeniyle %20-30 yanlış pozitif üretir. Eşiği her test için ayrı ayrı yapılandırın.
Her kasıtlı UI değişikliğinde — renk, yazı tipi, kenar boşluğu, simge değişiklikleri, öğe ekleme/kaldırma. Ortam değiştiğinde (OS sürümü, CI’daki yazı tipleri) referansları güncellemeyin — bu dengesiz bir testin işaretidir. Referanslar, kod incelemesinden sonra yalnızca geliştirici tarafından yerel olarak güncellenir: eski referansları sil, record=true ile testleri çalıştır, yeni ekran görüntülerini kontrol et, commit yap.
Evet — Android’de Espresso ve iOS’ta XCUITest aracılığıyla. Espresso, uygulama işlemi içinde çalışır ve Accessibility Service (UI Automator gibi) gerektirmez. XCUITest, Apple’ın UI testleri için standart framework’üdür. Screenshot testler için fark minimumdur: XCUITest biraz daha kararlı (yerel Apple API), UI Automator biraz daha esnektir (işlemler arası etkileşim).
Doğru yapılandırılırsa — hayır. Birleştirme öncesi: yalnızca değiştirilen ekranlarda screenshot testleri çalıştırın (30-60 saniye). Gece: Device Farm’da tam çalıştırma (30 dakika, 20 cihaz). Emülatörde screenshot test yürütme süresi: ekran başına 2-10 saniye. 20 ekran = 40-200 saniye. Bu, tek bir ekranın manuel test süresinden (5-10 dakika) daha azdır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun