Golden Test — nedir, snapshot testi nasıl çalışır ve uygulaması

Yazar: IT Sectr Yayınlanma: 2026-04-10 Okuma süresi: 9 dk

Golden Test (snapshot testi, referans testi) — mevcut bileşen çıktısının önceden kaydedilmiş bir referans görüntüsüyle (golden dosyası) karşılaştırıldığı bir görsel UI test yöntemidir. Piksel değişiklikleri belirlenen bir eşiği aşarsa, test başarısız olur ve bir diff görüntüsü oluşturur. Geliştirici diff'i inceler ve değişiklikleri kabul eder (golden'ı günceller) veya hatayı düzeltir. Daha fazla bilgi için Paparazzi hakkındaki Meta Engineering makalesine bakın.

Anahtar Noktalar

  • Golden Test — görsel gerilemeleri tespit etmek için mevcut UI'ı bir referans görüntüsüyle karşılaştırma
  • Diff görüntüsü — golden test başarısız olduğunda, değiştirilen pikselleri vurgulayan bir diff oluşturur
  • Android — Compose ve View bileşenlerinin ekran görüntüsü testi için Paparazzi ve Roborazzi
  • iOS — SwiftUI ve UIKit için SwiftSnapshotTesting (pointfree.co) ve Uber'in iOSSnapshotTestCase'i
  • CI Entegrasyonu — golden testler CI'da çalışır ve beklenmeyen UI değişikliklerinde başarısız olur

Golden Test nedir ve nasıl çalışır?

Golden Test, bir bileşenin görsel görünümünün bir referansla piksel piksel karşılaştırılarak otomatik olarak kontrol edilmesidir. Süreç: (1) geliştirici veya testçi bileşenin ilk anlık görüntüsünü oluşturur — bu “golden” (referans)dır. (2) Golden dosyası, testin yanında depoda kaydedilir. (3) Sonraki çalıştırmalarda, test bileşeni yeniden oluşturur ve kaydedilen golden ile karşılaştırır. (4) Görüntüler eşleşirse — test yeşil. Farklıysa — test kırmızı ve diff gösterir. Karar: ya değişiklikler bekleniyordur (golden güncellenir) ya da bu bir hatadır.

Golden nasıl oluşturulur — kütüphane, bileşeni gerçek bir ekran olmadan ekran dışı tampona (Android: Canvas, iOS: UIGraphicsImageRenderer) oluşturur. Bu, golden testlerin ekran öykünücüsü (sanal ekran) olmadan CI'da çalıştığı ve yürütmeyi hızlandırdığı anlamına gelir. Android'de Paparazzi, Android Studio'nun Layoutlib'ini — Layout Editor'ün kullandığı aynı motoru — kullanır. iOSSnapshotTestCase, CGImage'da UIKit oluşturmayı kullanır. Sonuç, sabit boyutlu bir PNG dosyasıdır.

Golden dosyalarının boyutu ve depolama yönetimi

Golden dosyaları — bir ekranın (1080x1920) PNG anlık görüntüsü, karmaşıklığa bağlı olarak 200–800 KB yer kaplar. 500 golden testi olan bir proje için, depoda ~100–400 MB'dir. Çözümler: (1) golden'ı Git LFS'de saklayın. (2) PNG sıkıştırma (pngcrush, oxipng) kullanın. (3) Golden'ı ayrı bir depolamada (S3) saklayın ve derleme sırasında indirin. IT Sectr'de, golden dosyalarını dosya başına 1 MB eşikle Git LFS'de saklıyoruz — bu testlerin %90'ı için yeterlidir.

Dengesiz (Flaky) golden testleri ve çözümü

Dengesiz golden testler — golden testlerin ana sorunu. Farklı GPU'lar, yazı tipi sürümleri ve kenar yumuşatma, piksellerde mikro farklılıklar oluşturur. Çözümler: eşik (izin verilen farklı piksel yüzdesi), bulanık karşılaştırma ve aynı CI aracılarında çalıştırma (aynı GPU, OS, öykünücü sürümü). Paparazzi piksel-mükemmel karşılaştırma kullanır, bu nedenle CI aracıları aynı olmalıdır.

Golden Test vs Screenshot Test: farkı nedir?

Golden Test, sabit bir referansa sahip bir ekran görüntüsü testi türüdür. “Golden” terimi, referansın ekip tarafından onaylandığı ve depoda saklandığı anlamına gelir. Herhangi bir görüntü değişikliği, geliştiricinin bilinçli bir karar vermesini gerektirir: golden'ı güncellemek veya kodu düzeltmek. Golden Test, tek tek bileşenler (Composable, UIView) düzeyinde çalışır ve gerçek bir cihaz gerektirmez.

Screenshot Test daha geniş bir kavramdır. Bir ekran görüntüsü testi, gerçek veriler, gezinme, sistem durum çubuğu ve animasyonlarla tam bir ekranı yakalayabilir. Ekran görüntüsü testleri genellikle UI Automator (Android) veya XCUITest (iOS) aracılığıyla gerçek cihazlarda veya öykünücülerde çalıştırılır. Golden testler, birim test ortamında (JVM, XCTest) öykünücü olmadan çalışır ve yalnızca tek bir bileşeni yakalar.

ÖzellikGolden TestScreenshot Test
SeviyeBileşen/Composable/ViewTam ekran
OrtamBirim test (ekran dışı tampon)Cihaz/Öykünücü
HızTest başına 50–200 msTest başına 2–30 saniye
AnimasyonlarDesteklenmezDesteklenir (duraklamalarla)
GPU'suz CIÇalışır (Layoutlib)Öykünücü gerektirir
Kurulum karmaşıklığıDüşükYüksek (Öykünücü/Device Farm)
DengesizlikOrta (farklı GPU'lar)Yüksek (öykünücü, zaman)

Kapsama stratejisi: golden vs screenshot

Golden vs Screenshot — her işlemede tek tek UI bileşenlerini (düğme, kart, iletişim kutusu) kontrol etmek için golden testler. Yayınlamadan önce tüm ekranların uçtan uca (E2E) kontrolü için ekran görüntüsü testleri. Golden testler geliştiriciye hızlı geri bildirim sağlar, ekran görüntüsü testleri tüm uygulamanın bütünlüğüne güven verir. IT Sectr'de, Pull Request'ler için golden testler (3–5 dakika) ve gecelik ekran görüntüsü testleri (30–60 dakika) kullanıyoruz.

Paparazzi ve Roborazzi: Android'de snapshot testi

Paparazzi — Cash App (Square) tarafından Android View ve Jetpack Compose bileşenlerini öykünücü olmadan PNG'ye dönüştüren bir kütüphane. Layoutlib'i (Android Studio Preview ile aynı motor) kullanır. Kurulum: Gradle eklentisini ekleyin, @Test ve @RunWith(PaparazziRule::class) ile bir test yazın, paparazzi.snapshot(view) çağrısı yapın. Paparazzi animasyonları, videoları veya gerçek cihazları desteklemez — yalnızca statik bileşen oluşturma.

kotlin
// build.gradle.kts (module)
plugins {
    id("app.cash.paparazzi") version "1.3.1"
}

// Compose bileşeni için Golden test
class ButtonGoldenTest {

    @get:Rule
    val paparazzi = Paparazzi(
        Paparazzi.PaparazziSnapshotConfig(
            deviceConfig = DeviceConfig.PIXEL_6,
            theme = "android:Theme.Material.Light.NoActionBar"
        )
    )

    @Test
    fun primary_button() {
        paparazzi.snapshot {
            Button(
                onClick = { },
                modifier = Modifier.width(200.dp)
            ) {
                Text("Submit")
            }
        }
    }
}

Roborazzi — Compose, View ve görüntü karşılaştırmasını destekleyen Paparazzi'ye bir alternatif. Fark: Roborazzi, Robolectric aracılığıyla çalışır ve bir eşiği (izin verilen piksel farkı yüzdesi) destekler. Bu, CI'da farklı GPU'larla dengesizliği azaltır. Roborazzi ayrıca değişikliklerin GIF animasyonlarını (önce/sonra/diff) oluşturabilir, bu da kod incelemesi için kullanışlıdır. Dosya biçimi: PNG + JSON meta verileri.

Golden'ı güncelleme — kasıtlı bir UI değişikliğinden sonra, geliştirici eski golden dosyalarını siler ve testleri record bayrağıyla çalıştırır. Paparazzi tüm golden dosyalarını yeniden oluşturur. Ardından geliştirici, kod değişikliğiyle birlikte yeni golden dosyalarını iletir. Kod incelemesinde, inceleyici eski ve yeni golden dosyalarının diff'ini görür. Değişiklikler onaylanırsa — PR birleştirilir. Onaylanmazsa — geliştirici kodu düzeltir ve testleri yeniden başlatır. Golden dosyalarını CI'da asla otomatik olarak güncellemeyin — yalnızca yerel olarak.

iOS'te SwiftSnapshotTesting ve iOSSnapshotTestCase

SwiftSnapshotTesting — pointfree.co'nun kütüphanesi, Composable Architecture'ın yaratıcıları. UIView, UIViewController, CALayer ve SwiftUI View'i destekler. İlke: assertSnapshot(matching: view, as: .image). İlk çalıştırmada, golden otomatik olarak oluşturulur. Sonraki çalıştırmalarda karşılaştırılır. Fark izin verilen eşiği aşarsa test başarısız olur. SwiftSnapshotTesting, CI (Xcode Cloud, GitHub Actions) ile uyumlu olan UIGraphicsImageRenderer aracılığıyla çalışır.

swift
import SnapshotTesting
import XCTest

final class ProfileCardSnapshotTests: XCTestCase {

    func test_profile_card_default() {
        let card = ProfileCard(
            name: "Alice",
            avatar: UIImage.testImage(),
            badge: "Pro"
        )
        let controller = UIHostingController(rootView: card)

        assertSnapshot(
            matching: controller,
            as: .image(on: .iPhoneSe),
            record: ProcessInfo.processInfo
                .environment["RECORD"] != nil
        )
    }
}

iOSSnapshotTestCase (eski adıyla FBSnapshotTestCase) — Uber'in UIKit için kütüphanesi. SwiftSnapshotTesting'in aksine, iOSSnapshotTestCase ekran boyutu ve yönünün belirtilmesini gerektirir. Golden dosyaları, ReferenceImages klasöründeki PNG'lerdir. Avantajı: SwiftUI olmadan UIKit ile çalışır ve iOS 12+'yı destekler. Dezavantajı: golden'ı otomatik olarak güncellemez — record bayrağıyla çalıştırılmalıdır. SwiftSnapshotTesting daha moderndir ve yeni projeler için önerilir.

Cihaza özel golden — golden dosyaları farklı ekran boyutları ve yönleri için farklılık gösterir. Standart yaklaşım: golden dosyalarını TestName@3x~iPhone14.png olarak adlandırın. SwiftSnapshotTesting, .image(on: .iPhoneSe) parametresi belirtilmişse otomatik olarak bir cihaz soneki ekler. Android'de Paparazzi, boyutu ayarlamak için DeviceConfig kullanır. Desteklenen her cihaz form faktörü için golden'ı ayrı ayrı saklayın. Farklı boyutlar için tek bir golden kullanmayın — bu dengesiz testlere yol açar.

CI'da golden dosyalarıyla çalışma ve güncelleme yönetimi

CI hattı — golden testler her Pull Request'te çalıştırılmalıdır. Bir test başarısız olursa, CI diff görüntüsünü bir derleme yapıtı olarak gösterir. Geliştirici diff'i inceler ve bir karar verir. Önemli: CI'da oluşturulan golden dosyaları asla otomatik olarak iletilmez. Yalnızca kasıtlı bir değişiklikten sonra geliştirici tarafından yerel olarak oluşturulur. GitHub Actions ve GitLab CI, tarayıcıda diff'leri görüntülemek için yapıt (png, html) yüklemeyi destekler.

Depo boyutu — golden dosyaları hızla büyür. 500 test = 100–400 MB PNG. Çözümler: (1) Git LFS — her golden LFS'de saklanır, yalnızca checkout sırasında kopyalanır. (2) Golden'ı ayrı bir depoda saklayın ve alt modül olarak ekleyin. (3) S3 + önbellekleme — golden S3'te, CI sağlama toplamına göre yalnızca değiştirilen dosyaları indirir. IT Sectr'de, track *.png filter=lfs diff=lfs merge=lfs text=false ile Git LFS kullanıyoruz. Yerel olarak, golden dosyaları src/test/goldens/ içindedir.

Golden kod incelemesi — normal git diff, PNG değişikliklerini göstermez. Çözümler: (1) GitHub, tıklandığında PNG görüntülerini açar. (2) Golden diff'lerin tarayıcıda görünür olduğu Review Apps'leri kullanın. (3) önce/sonra/diff sütunlarıyla bir HTML raporu oluşturun. Paparazzi, üç sütunlu (gerçek, beklenen, diff) bir HTML raporu oluşturur. Rapor, CI yapıtlarına eklenir. İnceleyiciler, dosyaları yerel olarak indirmeden raporu görüntüler.

Golden ne zaman güncellenmeli — yalnızca bilinçli bir UI değişikliğinden sonra. Yazı tipi, renk, dolgu, simge değişikliği — golden güncellenmelidir. Yeni bir düğme ekleme, öğeleri yeniden düzenleme — golden güncellenmelidir. Görsel görünümü değiştiren bir hata düzeltmesi — golden güncellenmelidir. UI değişikliği olmayan yeniden düzenleme — golden değişmemelidir. UI kodu değişikliği olmadan golden değişirse — bu ortamdan kaynaklanan dengesiz bir testtir, nedeni CI aracılarında veya bağımlılık sürümlerinde arayın.

Sıkça Sorulan Sorular

Golden Test, Screenshot Test'ten nasıl farklıdır?

Golden Test — birim test ortamında bileşen düzeyinde bir snapshot testi (hızlı, öykünücü gerektirmez). Screenshot Test — bir cihaz veya öykünücüde tam ekranı yakalar (daha yavaş, ancak gerçekçi). Golden, ekran dışı tamponla çalışır, screenshot gerçek ekranla çalışır. Golden her işlemede CI için uygundur, screenshot yayın öncesi gecelik çalıştırmalar için uygundur.

Dengesiz golden testlerle nasıl başa çıkılır?

Ana nedenler: (1) CI'da farklı GPU'lar — aynı CI aracılarını kullanın. (2) Farklı yazı tipi sürümleri — OS sürümünü sabitleyin. (3) Farklı kenar yumuşatma — bir eşik yapılandırın (Roborazzi, iOSSnapshotTestCase). (4) Animasyonlar — testlerde animasyonları devre dışı bırakın. (5) Sistem öğeleri (durum çubuğu) — çerçevesiz cihaz yapılandırması kullanın. Paparazzi, Layoutlib sayesinde dengesizliğe eğilimli değildir.

Golden Test, Jetpack Compose ile kullanılabilir mi?

Evet. Paparazzi, paparazzi.snapshot { } aracılığıyla Compose için yerleşik desteğe sahiptir. Roborazzi de Compose'u destekler. iOS'te SwiftSnapshotTesting, UIHostingController aracılığıyla SwiftUI ile çalışır. Compose bileşenleri Layoutlib aracılığıyla, SwiftUI UIKit oluşturma aracılığıyla oluşturulur. Sınırlama: Compose ve SwiftUI animasyonları desteklenmez — golden test yalnızca başlangıç durumunu yakalar.

Golden değişiklikleri otomatik olarak nasıl kabul edilir?

Golden kabulünü CI'da asla otomatikleştirmeyin. Yalnızca yerel olarak: geliştirici eski golden dosyalarını dizinden siler ve testleri record bayrağıyla çalıştırır (Paparazzi: record=true, SwiftSnapshotTesting: record=true). Golden dosyaları yeniden oluşturulur. Geliştirici her golden'ı doğruluk açısından kontrol eder, değişiklikleri kodla birlikte iletir. CI'da otomatik kabul, UI hatalarının gözden kaçmasına neden olur.

Golden Test derlemeyi yavaşlatır mı?

Golden testler, araçsal testlerden (UI Automator, XCUITest) daha hızlıdır. Bir golden test 50–200 ms'de yürütülür (Paparazzi: ortalama bir MacBook Pro'da 100–150 ms). 500 golden test = 25–100 saniye. Öykünücü aracılığıyla ekran görüntüsü testleriyle karşılaştırın: test başına 5–30 saniye. Golden testler derlemeyi yavaşlatmaz: 100 test = ~15 saniye, birleştirme öncesi kontrol için kabul edilebilir.

Özet

  • Golden Test — referans PNG görüntüsüyle karşılaştırarak UI bileşenlerinin görsel testi
  • Süreç — bileşeni ekran dışı tamponda oluşturma, piksel piksel karşılaştırma, uyuşmazlıkta diff
  • Android — Paparazzi (Compose/View, Layoutlib) ve Roborazzi (Compose/View, eşik, Robolectric)
  • iOS — SwiftSnapshotTesting (pointfree) ve Uber'in iOSSnapshotTestCase'i UIKit ve SwiftUI için
  • CI Hattı — her PR'da golden testler, diff yapıtları, yalnızca yerel golden güncellemesi
  • Git LFS — PNG dosyalarının (500 test için 100–400 MB) saklanması için zorunlu
  • Dengesizlik — GPU, yazı tipleri ve kenar yumuşatmayla ilgili; eşik ve aynı CI aracılarıyla çözülür

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.

Projeyi tartış

Ayrıca okuyun