Espresso — apa itu, prinsip kerja dan cara menggunakannya

Penulis: IT Sectr Diterbitkan: 2026-04-08 Waktu membaca: 8 mnt

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 — framework pengujian UI Android dengan sinkronisasi thread otomatis.
  • ViewMatcher — pencarian elemen View di layar berdasarkan ID, teks, hierarki induk.
  • ViewAction — tindakan pada elemen: klik, input teks, geser.
  • ViewAssertion — pemeriksaan status elemen: ditampilkan, berisi teks, aktif.
  • Idling Resource — mekanisme menunggu penyelesaian operasi asinkron sebelum pemeriksaan UI.

Apa itu Espresso?

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.

Bagaimana Espresso bekerja

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 Dasar Espresso

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.

kotlin
@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()))
}

Aturan ActivityScenario

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().

MatcherTujuan
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

Kombinasi 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: interaksi dengan UI

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.

Rantai Tindakan

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.

kotlin
// 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())

Pemeriksaan melalui onData

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: pemeriksaan status

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 Umum

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.

ViewAssertions Kustom

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.

kotlin
// 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 Resources untuk operasi asinkron

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.

Contoh dengan coroutine

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.

kotlin
// 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
    }
}

Konfigurasi Espresso di proyek Android

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.

Konfigurasi Gradle

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.

kotlin
// 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")
}

Menjalankan tes di CI

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

Apa perbedaan Espresso dengan UI Automator?

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.

Mengapa Espresso disebut framework “anjing berkaki tiga”?

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.

Bagaimana cara menguji RecyclerView dengan Espresso?

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.

Apa itu tes flaky dan bagaimana Espresso mengatasinya?

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.

Bisakah Espresso digunakan untuk pengujian screenshot?

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

  • Espresso — framework pengujian UI Android dari Google dengan sinkronisasi otomatis.
  • ViewMatchers — API untuk mencari elemen berdasarkan ID, teks, hierarki, dan kombinasi.
  • ViewActions — click, typeText, scrollTo, swipe untuk interaksi dengan UI.
  • ViewAssertions — matches, doesNotExist untuk memeriksa status elemen.
  • Idling Resource — sinkronisasi tes dengan operasi asinkron dan coroutine.
  • Tiga langkah — onView().perform().check() = temukan, lakukan, periksa.
  • AndroidX Test — pustaka untuk menjalankan tes instrumental di emulator atau perangkat.

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.

Diskusikan proyek

Baca juga