Espresso adalah framework untuk pengujian UI otomatis aplikasi Android, dikembangkan oleh tim Google dan merupakan bagian dari AndroidX Test. Berbeda dengan tes instrumental yang memeriksa komponen terisolasi, Espresso berinteraksi dengan UI nyata: menekan tombol, memasukkan teks, memeriksa tampilan elemen. Menurut Google Android Developers, Espresso menyediakan sinkronisasi otomatis dengan thread UI, yang menghilangkan kebutuhan akan Thread.sleep() manual.
Poin Utama
Espresso adalah pustaka untuk menulis tes UI otomatis untuk Android, yang merupakan bagian dari Google AndroidX Test. Ini menyediakan API untuk menemukan elemen View di layar, melakukan tindakan pada mereka (klik, input, geser) dan memeriksa status mereka (ditampilkan, berisi teks, aktif).
Fitur utama Espresso adalah sinkronisasi otomatis dengan thread utama aplikasi. Framework menunggu penyelesaian semua tugas asinkron (coroutine, AsyncTask, Handler) sebelum melakukan pemeriksaan berikutnya. Ini menghilangkan tes flaky yang terkait dengan race condition dan membuat tes UI stabil dan andal — tidak ada tes yang berisi Thread.sleep() atau loop tunggu.
Espresso mengikuti prinsip Three-Legged Dog — tes terdiri dari tiga langkah: temukan elemen (ViewMatcher), lakukan tindakan (ViewAction), periksa hasil (ViewAssertion). Ketiga langkah ditulis dalam rantai panggilan onView().perform().check(). Konsep ini membuat tes dapat diprediksi dan mudah dibaca — setiap tes dengan jelas menjelaskan apa yang dicari, apa yang dilakukan, dan apa yang diperiksa.
Arsitektur Espresso didasarkan pada tiga komponen: Espresso (titik masuk — metode statis onView dan onData), ViewMatchers (pencarian elemen), ViewActions (tindakan) dan ViewAssertions (pemeriksaan). Di dalamnya, framework menggunakan Idling Resource untuk sinkronisasi dengan thread UI.
Tes sederhana menemukan tombol berdasarkan ID, melakukan klik, dan memeriksa apakah teks “Selesai” muncul. Semua operasi dilakukan secara sinkron dari sudut pandang tes — Espresso menjamin bahwa thread UI telah menyelesaikan pemrosesan peristiwa sebelum tes melanjutkan eksekusi. Ini dicapai melalui mekanisme tunggu bawaan: onView memblokir eksekusi tes sampai UI menjadi stabil.
@Test
fun buttonClick_showsSuccessText() {
// Menemukan tombol berdasarkan ID dan klik
onView(withId(R.id.button_submit))
.perform(click())
// Memeriksa bahwa teks “Selesai” ditampilkan
onView(withText("Selesai"))
.check(matches(isDisplayed()))
}
Untuk menjalankan tes Espresso, digunakan ActivityScenario (AndroidX Test) yang membuat Activity dalam status yang diinginkan — berjalan, dijeda, dihancurkan. ActivityScenario memungkinkan pengujian siklus hidup Activity selain UI murni. Misalnya, dapat diperiksa bahwa data disimpan saat rotasi layar (rekreasi Activity) dan dipulihkan setelah penghancuran.
ViewMatchers adalah kumpulan metode dari kelas Espresso.onView yang memungkinkan menemukan View di layar berdasarkan berbagai kriteria: ID sumber daya (R.id), teks, petunjuk hint, elemen induk dan hierarki. Jika satu matcher tidak memberikan hasil unik, matcher dikombinasikan melalui allOf().
| Matcher | Tujuan |
|---|---|
| withId(R.id.name) | Pencarian berdasarkan ID sumber daya |
| withText(“teks”) | Pencarian berdasarkan teks yang ditampilkan |
| withHint(“petunjuk”) | Pencarian berdasarkan atribut hint EditText |
| isDisplayed() | Memeriksa apakah elemen terlihat di layar |
| hasSibling(matcher) | Pencarian berdasarkan elemen tetangga |
| allOf(m1, m2) | Kombinasi beberapa matcher |
Jika ada beberapa elemen identik di layar (misalnya, dua TextView dengan teks berbeda), lebih mudah untuk menggabungkan matcher melalui allOf: onView(allOf(withId(R.id.title), withText(“Halo”))). Ini menjamin pemilihan elemen tunggal. Operator kebalikan — not() — mengecualikan elemen dari pencarian, dan hasSibling() mencari elemen di samping elemen yang dikenal.
ViewActions adalah tindakan yang dilakukan Espresso pada View yang ditemukan: click(), typeText(), clearText(), scrollTo(), swipeLeft() dan lainnya. Tindakan diteruskan ke metode perform() yang dapat menerima beberapa tindakan berturut-turut.
Metode perform() menerima vararg ViewAction, yang memungkinkan menjalankan serangkaian tindakan pada satu elemen: membersihkan bidang, memasukkan teks baru, menutup keyboard, dan menekan tombol. Semua tindakan dilakukan dalam urutan yang disebutkan, dan Espresso menjamin bahwa tindakan sebelumnya selesai sebelum yang berikutnya dimulai.
// Memasukkan teks di EditText dan menekan tombol
onView(withId(R.id.edit_email))
.perform(
clearText(),
typeText("user@example.com"),
closeSoftKeyboard()
)
onView(withId(R.id.button_login))
.perform(click())
Untuk elemen di dalam AdapterView (ListView, RecyclerView), metode onData() digunakan sebagai pengganti onView. Ini bekerja dengan data adaptor, bukan dengan View — menemukan elemen berdasarkan konten model dan mengembalikan View yang sesuai untuk tindakan selanjutnya. onData menggunakan matcher hamcrest untuk menemukan elemen berdasarkan bidang model data.
ViewAssertions memeriksa apakah View berada dalam status tertentu. Metode dasar — matches(matcher) — memeriksa apakah elemen sesuai dengan matcher yang diberikan. Selain itu, Espresso menawarkan doesNotExist() (elemen tidak ada) dan selectedDescendantsMatch() (pemeriksaan elemen bersarang).
Pemeriksaan paling umum dalam tes UI: elemen ditampilkan (isDisplayed), elemen berisi teks tertentu (withText), elemen aktif (isEnabled), elemen tidak dipilih (isNotChecked). Setiap pemeriksaan melempar pengecualian terperinci jika gagal — dengan menyebutkan hierarki View di layar. Ini menyederhanakan debugging: dalam pesan kesalahan terlihat elemen mana yang benar-benar ada di layar pada saat pemeriksaan.
Jika pemeriksaan standar tidak mencukupi, Anda dapat membuat sendiri melalui antarmuka ViewAssertion. Assertion kustom menerima View dan dapat memeriksa statusnya secara terprogram — misalnya, warna teks, margin, atau status komponen kustom yang tidak diekspos melalui matcher standar.
// Pemeriksaan: TextView ditampilkan dan berisi teks
onView(withId(R.id.text_welcome))
.check(matches(isDisplayed()))
.check(matches(withText("Selamat datang")))
// Pemeriksaan: elemen TIDAK ditampilkan
onView(withId(R.id.progress_bar))
.check(doesNotExist())
Idling Resource adalah mekanisme Espresso untuk menyinkronkan tes dengan operasi asinkron. Secara default, Espresso menunggu penyelesaian Handler, AsyncTask, dan coroutine (melalui coroutinesIdlingResource). Jika aplikasi melakukan pekerjaan latar belakang melalui thread sendiri atau layanan Callback, Idling Resource kustom harus didaftarkan.
Mulai dari AndroidX Test 1.4.0, Espresso mendukung coroutine melalui CoroutinesIdlingResource. Tes secara otomatis menunggu penyelesaian semua coroutine yang dijalankan sebelum melakukan pemeriksaan UI. Untuk skenario yang lebih kompleks, digunakan CountingIdlingResource — penghitung yang bertambah saat tugas dimulai dan berkurang saat selesai.
// Mendaftarkan IdlingResource untuk OkHttp
class OkHttpIdlingResource(
private val client: OkHttpClient
) : IdlingResource {
private var isIdle = true
private var watcher: IdlingResource.ResourceCallback? = null
override fun getName() = "OkHttp"
override fun isIdleNow() = isIdle
override fun registerIdleTransitionCallback(
callback: IdlingResource.ResourceCallback
) {
watcher = callback
}
}
Koneksi Espresso di proyek Android dilakukan dengan menambahkan dependensi di build.gradle tingkat modul. Espresso adalah bagian dari AndroidX Test, jadi cukup menentukan dependensi untuk inti Espresso, ekstensi, dan integrasi JUnit. Tes ditempatkan di direktori src/androidTest dan dijalankan pada perangkat fisik atau emulator melalui AndroidJUnitRunner.
Set dependensi minimal mencakup espresso-core (inti), espresso-contrib (matcher tambahan untuk RecyclerView, Drawer, Picker) dan runner (runner tes AndroidX). Semua tes dijalankan pada emulator atau perangkat fisik melalui Android Test Orchestrator.
// build.gradle.kts (androidTest dependencies)
android {
defaultConfig {
testInstrumentationRunner =
"androidx.test.runner.AndroidJUnitRunner"
}
}
dependencies {
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
androidTestImplementation("androidx.test.espresso:espresso-contrib:3.6.1")
androidTestImplementation("androidx.test:runner:1.6.1")
androidTestImplementation("androidx.test:rules:1.6.1")
}
Tes Espresso dapat dijalankan melalui Google Android Test Orchestrator, yang mengisolasi setiap tes dalam proses terpisah dan membersihkan status di antara eksekusi. Ini menghilangkan tes flaky yang terkait dengan data sisa dari tes sebelumnya dan meningkatkan stabilitas di server CI. Untuk eksekusi paralel, digunakan sharding — distribusi tes di antara beberapa emulator.
Pertanyaan Umum
Espresso bekerja di dalam proses aplikasi dan menggunakan sinkronisasi otomatis dengan thread UI. UI Automator bekerja di tingkat sistem, dapat berinteraksi dengan aplikasi lain, tetapi memerlukan manajemen tunggu manual.
Ini adalah metafora dari presentasi Google: tes Espresso berdiri di tiga pilar — ViewMatcher (pencarian), ViewAction(tindakan) dan ViewAssertion(pemeriksaan). Jika salah satu dihilangkan, tes kehilangan stabilitas, seperti anjing berkaki tiga.
Untuk RecyclerView, gunakan pustaka espresso-contrib dan metode onView(withId(R.id.recycler)).perform(actionOnItemAtPosition(0, click())). Alternatifnya — onData() untuk AdapterView atau ViewAction kustom untuk mencari elemen berdasarkan teks di dalam RecyclerView. Selain itu, RecyclerViewActions dari espresso-contrib dapat digunakan untuk scroll ke elemen dan tindakan padanya.
Tes flaky adalah tes yang terkadang gagal tanpa perubahan kode, karena race condition atau asinkronisitas. Espresso memecahkan masalah ini melalui Idling Resource — menunggu penyelesaian semua tugas latar belakang sebelum melakukan pemeriksaan.
Espresso sendiri tidak dirancang untuk tes screenshot, tetapi dapat dikombinasikan dengan pustaka seperti Shot atau Paparazzi. Espresso menyiapkan UI ke status yang diinginkan, dan pustaka perbandingan mengambil screenshot dan membandingkannya dengan referensi. Pendekatan ini disebut pengujian regresi visual dan membantu menemukan perubahan tak terduga dalam antarmuka.
Ringkasan
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