Screenshot Test — pemeriksaan otomatis antarmuka pengguna dengan menangkap dan membandingkan tangkapan layar aplikasi dengan gambar referensi. Berbeda dengan golden test, screenshot test dijalankan pada perangkat nyata atau emulator, menangkap layar penuh dengan navigasi, elemen sistem dan animasi, serta menggunakan UI Automator (Android) atau XCUITest (iOS) untuk berinteraksi dengan aplikasi. Selengkapnya — di dokumentasi Android UI Automator.
Poin Utama
Screenshot Test — adalah pengujian end-to-end antarmuka pengguna, di mana test membuka layar aplikasi, melakukan tindakan (tap, memasukkan teks, scroll) dan mengambil tangkapan layar dari kondisi yang diperoleh. Tangkapan layar dibandingkan dengan referensi (baseline) yang disimpan di repositori. Jika tangkapan layar berbeda — test gagal. Screenshot test mendeteksi regresi visual yang tidak terlihat di unit test: margin yang salah, elemen yang tumpang tindih, warna yang salah.
Mengapa screenshot test diperlukan jika sudah ada golden test — golden test memeriksa komponen secara terisolasi: satu tombol, satu kartu, satu teks. Screenshot test memeriksa seluruh layar di lingkungan yang sedekat mungkin dengan produksi: navigasi nyata, data nyata (atau mock yang paling realistis), font sistem nyata, status bar nyata. Hanya screenshot test yang akan menunjukkan bahwa tombol tumpang tindih dengan elemen lain pada perangkat nyata.
Nilai bisnis — menurut data Google (2023), bug visual mencakup 15-25% dari semua bug aplikasi mobile. Screenshot test mengotomatiskan pemeriksaan kualitas visual yang sebelumnya dilakukan secara manual oleh insinyur QA. Satu screenshot test menggantikan 5-10 menit pengujian manual satu layar. Untuk aplikasi dengan 50 layar, penghematan: 4-8 jam-kerja untuk satu kali run regresi. Screenshot test akan terbayar dalam 2-3 siklus rilis.
Golden test lebih cepat dan sederhana: render komponen di buffer off-screen membutuhkan milidetik, tidak memerlukan perangkat, stabil di CI. Screenshot test lebih realistis: menangkap layar nyata dengan elemen sistem, mendukung animasi dan navigasi, bekerja pada perangkat nyata. Pilihan tergantung pada tujuan: umpan balik cepat untuk pengembang (golden) atau realisme maksimal sebelum rilis (screenshot).
| Karakteristik | Screenshot Test | Golden Test |
|---|---|---|
| Kecepatan | 2-30 detik | 50-200 ms |
| Realisme | Maksimal (perangkat nyata) | Terbatas (off-screen) |
| Memerlukan perangkat | Ya (emulator/fisik) | Tidak (JVM, XCTest) |
| Animasi | Mendukung | Tidak mendukung |
| Navigasi | Skenario multi-langkah | Satu komponen |
| Flakiness | Tinggi (jaringan, waktu) | Sedang (GPU, font) |
| Paralelisme | Device Farm (Firebase, AWS) | Multi-thread JVM/XCTest |
Golden + Screenshot — gunakan golden test untuk setiap komponen UI di pustaka komponen (Design System). 80% regresi visual tertangkap di tingkat komponen. Screenshot test — untuk jalur pengguna kritis: onboarding, login, alur pembayaran, keranjang. 20% regresi terkait integrasi komponen di layar nyata hanya tertangkap oleh screenshot test. Di IT Sectr kami menggunakan rasio 80/20: 400 golden + 100 screenshot.
Kapan screenshot test tidak diperlukan — jika layar terdiri dari konten statis tanpa interaktivitas, golden test komponen memberikan tingkat pemeriksaan yang sama dengan biaya lebih rendah. Jika layar berubah secara dinamis (feed, chat), screenshot test memerlukan konfigurasi data yang rumit dan waktu tunggu. Dalam kasus seperti itu, gunakan screenshot untuk status dasar (daftar kosong, memuat) dan golden untuk kartu individu dalam daftar.
UI Automator — framework Android untuk pengujian UI antar-aplikasi. Memungkinkan mengambil tangkapan layar melalui UiDevice.takeScreenshot(). Berbeda dengan Espresso (bekerja di dalam satu aplikasi), UI Automator dapat berinteraksi dengan dialog sistem (izin, notifikasi) dan aplikasi lain. Screenshot test di UI Automator: buka aplikasi, tunggu pemuatan, ambil tangkapan layar, bandingkan dengan referensi.
class LoginScreenScreenshotTest {
@get:Rule
val rule = ComposeTestRule.createAndroidComposeRule<MainActivity>()
@Test
fun login_screen_default() {
val device = UiDevice.getInstance(
InstrumentationRegistry.getInstrumentation()
)
// Menunggu layar dimuat
IdlingRegistry.getInstance().waitForIdle()
// Ambil screenshot
val screenshot = device.takeScreenshot()
val golden = loadGolden("login_default.png")
// Bandingkan dengan referensi
val diff = ImageComparator.compare(screenshot, golden)
assertTrue(diff.similarity > 0.98)
}
}
Firebase Test Lab — layanan Google Cloud untuk menjalankan test instrumental pada ratusan perangkat nyata secara paralel. Screenshot test di Firebase Test Lab menangkap tangkapan layar pada berbagai perangkat (Pixel 7, Galaxy S24, Xiaomi 14) dan membandingkannya dengan referensi. Kelebihan: satu test memeriksa UI pada 20 perangkat dalam 10-15 menit. Kekurangan: biaya ($1-5 per test pada 20 perangkat). Firebase Test Lab terintegrasi dengan CI melalui gcloud CLI atau plugin Gradle.
Shot — pustaka untuk screenshot test di Android yang memudahkan pembuatan dan perbandingan tangkapan layar. Shot bekerja di atas Espresso dan UI Automator, menambahkan manajemen golden (membuat, memperbarui, menghapus), perbandingan dengan ambang (piksel atau persentase) dan pembuatan laporan HTML. Shot cocok untuk proyek yang ingin menerapkan screenshot test dengan cepat tanpa menulis infrastruktur perbandingan gambar sendiri.
XCUITest — framework Apple untuk pengujian UI aplikasi iOS, iPadOS dan tvOS. Screenshot test di XCUITest menggunakan XCUIScreen.main.screenshot() untuk menangkap layar dan XCAttachment untuk menyimpan tangkapan layar. XCUITest mensimulasikan tindakan pengguna: tap, swipe, typeText, dan mengambil tangkapan layar setelah setiap langkah. Di Xcode 16+ dukungan bawaan untuk membandingkan tangkapan layar dengan referensi melalui XCTAttachment telah ditambahkan.
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)
// Ambil screenshot
let screenshot = app.screenshot()
let attachment = XCTAttachment(screenshot: screenshot)
attachment.name = "Login-Screen-Initial"
attachment.lifetime = .keepAlways
add(attachment)
// Perbandingan dengan referensi (memerlukan XCTAttachment + golden)
assertScreenshot(
screenshot: screenshot,
goldenName: "login_initial_state"
)
}
}
Xcode Cloud — CI cloud dari Apple untuk membangun dan menguji aplikasi iOS. Xcode Cloud mendukung menjalankan test XCUITest pada simulator. Screenshot test dapat dijalankan pada beberapa simulator secara paralel (iPhone 15, iPhone 15 Pro Max, iPad Pro). Hasil: XCResult Bundle dengan lampiran. Xcode Cloud tidak terintegrasi di GitHub/GitLab — gunakan Xcode Cloud Webhooks untuk integrasi. Alternatif: GitHub Actions dengan macos-14 dan xcodebuild.
Framework perbandingan — iOSSnapshotTestCase (Uber) juga berfungsi untuk screenshot test jika dijalankan di simulator. SwiftSnapshotTesting (pointfree) lebih berfokus pada golden test komponen. Untuk screenshot test di iOS gunakan alat bawaan XCUITest + XCTAttachment + ImageComparator kustom (Pixelmator atau AImage). Di CI gunakan simulator — pada perangkat nyata screenshot test hanya berfungsi melalui Device Farm (AWS Device Farm).
Manajemen baseline — tangkapan layar referensi disimpan di repositori (Git LFS) atau di S3. Setiap tangkapan layar diberi nama sesuai template: {testName}_{device}_{orientation}_{locale}.png. Contoh: loginScreenPixel7PortraitRu.png. Saat menambahkan perangkat atau locale baru, baseline baru dibuat. Saat UI berubah, baseline lama diganti dengan yang baru setelah code review. Baseline adalah bagian dari basis kode, sama seperti sumber test.
CI Pipeline — (1) Membangun aplikasi. (2) Menjalankan screenshot test pada emulator/simulator. (3) Membandingkan tangkapan layar dengan baseline. (4) Jika tidak cocok — menghasilkan gambar diff. (5) Mengunggah artefak diff (actual, expected, diff — tiga file). (6) Menerbitkan laporan HTML dengan tabel hasil. (7) Jika ambang terlampaui — test gagal. (8) Reviewer memeriksa artefak diff dan mengambil keputusan: setujui (perbarui baseline) atau tolak (perbaiki kode).
Ambang dan toleransi — perbandingan absolut piksel per piksel terlalu ketat. Gunakan SSIM (Structural Similarity Index) atau MSE (Mean Squared Error). SSIM 0.98 = 98% kesamaan struktural — ambang yang baik. Untuk layar yang berbeda mungkin diperlukan ambang yang berbeda: tema gelap (lebih banyak hitam — akurasi lebih tinggi), gradien (lebih banyak noise — akurasi lebih rendah). Konfigurasikan ambang per-test melalui parameter: @ScreenshotTest(threshold = 0.99).
Device Farm vs Simulator — test pada perangkat nyata (Firebase Test Lab, AWS Device Farm) memberikan realisme maksimal, tetapi lambat dan berbayar. Test pada simulator/emulator — cepat dan gratis, tetapi tidak menunjukkan karakteristik perangkat nyata (GPU berbeda, reproduksi warna layar, kerapatan piksel). Strategi: simulator untuk pemeriksaan pre-merge (5 menit), Device Farm untuk nightly (30 menit, 20 perangkat). Di IT Sectr kami menggunakan Firebase Test Lab untuk run nightly pada 10 perangkat Android teratas.
Pertanyaan yang Sering Diajukan
Golden Test — untuk pemeriksaan cepat komponen UI individual di setiap commit (50-200 ms). Screenshot Test — untuk pemeriksaan E2E seluruh layar pada perangkat nyata sebelum rilis (2-30 detik). Gunakan keduanya: golden untuk komponen Design System, screenshot untuk jalur pengguna kritis. Rasio 80/20 optimal untuk sebagian besar proyek.
SSIM 0.98 — ambang awal yang baik untuk sebagian besar layar. Untuk tema gelap bisa 0.99 (kontras lebih tinggi — perbandingan lebih akurat). Untuk layar dengan gradien dan gambar — 0.95-0.97. Jangan gunakan perbandingan absolut piksel per piksel (MSE = 0) — ini memberikan 20-30% positif palsu karena anti-aliasing dan perbedaan GPU. Konfigurasikan ambang secara individual untuk setiap test.
Pada setiap perubahan UI yang disengaja — perubahan warna, font, margin, ikon, penambahan/penghapusan elemen. Jangan perbarui baseline saat perubahan lingkungan (versi OS, font di CI) — ini tanda test flaky. Baseline hanya diperbarui secara lokal oleh pengembang setelah code review: hapus baseline lama, jalankan test dengan record=true, periksa tangkapan layar baru, commit.
Ya — melalui Espresso di Android dan XCUITest di iOS. Espresso bekerja di dalam proses aplikasi dan tidak memerlukan Accessibility Service (seperti UI Automator). XCUITest — framework standar Apple untuk test UI. Untuk screenshot test perbedaannya minimal: XCUITest sedikit lebih stabil (API asli Apple), UI Automator sedikit lebih fleksibel (komunikasi antar-proses).
Jika dikonfigurasi dengan benar — tidak. Pre-merge: jalankan hanya screenshot test pada layar yang diubah (30-60 detik). Nightly: run penuh di Device Farm (30 menit, 20 perangkat). Waktu eksekusi screenshot test di emulator: 2-10 detik per layar. 20 layar = 40-200 detik. Ini lebih sedikit dari waktu pengujian manual satu layar (5-10 menit).
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga