Pengujian Antarmuka dengan Espresso
Tulis pengujian antarmuka otomatis dengan Espresso. Temukan view dengan onView(), berinteraksilah menggunakan perform(), periksa status dengan check(), dan uji interaksi RecyclerView.
Pengujian Antarmuka dengan Espresso adalah pelajaran Android Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Android Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Android Academy mencakup 4 pelajaran total.
Apa Itu Espresso?
Espresso adalah kerangka kerja resmi Android untuk pengujian UI. Espresso memungkinkan Anda menulis pengujian yang berinteraksi dengan UI aplikasi — mengetuk tombol, mengetik teks, menggulir daftar — dan memastikan hal yang ditampilkan di layar.
Espresso berjalan pada perangkat atau emulator (pengujian berinstrumentasi), dan secara otomatis menyinkronkan diri dengan thread UI — tidak diperlukan pemanggilan sleep() yang tidak stabil.
Penyiapan
Espresso disertakan dalam perangkat pengujian Android. Tambahkan dependensi ini ke app/build.gradle:
// app/build.gradle:
android {
defaultConfig {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
}
dependencies {
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.5.1' // RecyclerView
}ActivityScenarioRule
Gunakan ActivityScenarioRule untuk meluncurkan Activity sebelum setiap pengujian dan menutupnya setelah pengujian selesai:
@RunWith(AndroidJUnit4::class)
class LoginActivityTest {
@get:Rule
val activityRule = ActivityScenarioRule(LoginActivity::class.java)
@Test
fun `login button is displayed`() {
onView(withId(R.id.btnLogin))
.check(matches(isDisplayed()))
}
}onView() dan ViewMatchers
onView(matcher) menemukan view dalam hierarki saat ini. Gabungkan matcher agar hasilnya lebih tepat:
// Match by ID:
onView(withId(R.id.tvTitle))
// Match by text:
onView(withText("Submit"))
// Match by content description (for accessibility):
onView(withContentDescription("Close dialog"))
// Combine matchers:
onView(allOf(withId(R.id.btnSave), isEnabled()))
// Inside a specific parent:
onView(withId(R.id.btnSave)).inRoot(isDialog())ViewActions — Berinteraksi dengan View
Setelah menemukan view, lakukan suatu tindakan dengan .perform():
// Tap a button:
onView(withId(R.id.btnLogin)).perform(click())
// Type into an EditText:
onView(withId(R.id.etEmail))
.perform(typeText("alice@example.com"), closeSoftKeyboard())
// Clear text and retype:
onView(withId(R.id.etPassword))
.perform(clearText(), typeText("secret123"), closeSoftKeyboard())
// Scroll to a view:
onView(withId(R.id.btnSubmit)).perform(scrollTo(), click())
// Long press:
onView(withId(R.id.ivImage)).perform(longClick())ViewAssertions — Memverifikasi Keadaan
Periksa hal yang ditampilkan di layar dengan .check():
// View is displayed:
onView(withId(R.id.tvError)).check(matches(isDisplayed()))
// View has specific text:
onView(withId(R.id.tvTitle)).check(matches(withText("Welcome!")))
// View is not displayed (GONE or INVISIBLE):
onView(withId(R.id.progressBar)).check(matches(not(isDisplayed())))
// View is enabled:
onView(withId(R.id.btnSave)).check(matches(isEnabled()))
// View does not exist:
onView(withId(R.id.tvError)).check(doesNotExist())Pengujian Login Lengkap
Pengujian lengkap yang mengetik kredensial dan mengetuk login:
@Test
fun `successful login shows home screen`() {
// Type email
onView(withId(R.id.etEmail))
.perform(typeText("alice@example.com"), closeSoftKeyboard())
// Type password
onView(withId(R.id.etPassword))
.perform(typeText("password123"), closeSoftKeyboard())
// Tap login button
onView(withId(R.id.btnLogin)).perform(click())
// Assert welcome message is shown
onView(withId(R.id.tvWelcome))
.check(matches(withText("Welcome, Alice!")))
}Menguji RecyclerView
Gunakan RecyclerViewActions dari espresso-contrib untuk berinteraksi dengan item daftar:
import androidx.test.espresso.contrib.RecyclerViewActions
@Test
fun `clicking item opens detail screen`() {
// Scroll to position 5 and click:
onView(withId(R.id.recyclerView))
.perform(RecyclerViewActions.actionOnItemAtPosition<RecyclerView.ViewHolder>(
5, click()
))
// Assert detail screen is shown:
onView(withId(R.id.tvDetailTitle)).check(matches(isDisplayed()))
}Menguji Validasi Input
Pastikan pesan error muncul saat input tidak valid:
@Test
fun `empty email shows error message`() {
// Leave email blank, tap login
onView(withId(R.id.btnLogin)).perform(click())
// Assert error is shown
onView(withId(R.id.tilEmail))
.check(matches(hasDescendant(withText("Email is required"))))
}
@Test
fun `short password shows error`() {
onView(withId(R.id.etPassword))
.perform(typeText("123"), closeSoftKeyboard())
onView(withId(R.id.btnLogin)).perform(click())
onView(withId(R.id.tilPassword))
.check(matches(hasDescendant(withText("Minimum 6 characters"))))
}Sumber Daya Idling
Espresso secara otomatis menunggu thread UI menjadi tidak sibuk, tetapi tidak menunggu panggilan jaringan atau coroutine. Gunakan IdlingResource untuk memberi tahu Espresso agar menunggu pekerjaan asinkron Anda:
// CountingIdlingResource: increment before async work, decrement when done
val idlingResource = CountingIdlingResource("NetworkCall")
// In your ViewModel/Repository:
idlingResource.increment()
viewModelScope.launch {
loadData()
idlingResource.decrement()
}
// In test setUp:
@Before
fun setUp() {
IdlingRegistry.getInstance().register(idlingResource)
}
@After
fun tearDown() {
IdlingRegistry.getInstance().unregister(idlingResource)
}Menjalankan Pengujian Espresso
Jalankan pengujian berinstrumentasi pada perangkat atau emulator yang terhubung:
- Di Android Studio: klik kanan kelas pengujian → Jalankan
- Melalui terminal:
./gradlew connectedAndroidTest - Hasilnya muncul di
app/build/reports/androidTests/
Gunakan Android Emulator API 28+ agar pengujian berjalan stabil dan cepat. Nonaktifkan animasi dalam pengaturan pengembang untuk mencegah hasil yang tidak stabil.
Pemeriksaan Cepat
Apa pola Espresso yang benar untuk menemukan view dan memeriksa teksnya?
Ringkasan: Pengujian UI dengan Espresso
Pengujian UI otomatis menemukan regresi sebelum pengguna menemukannya:
onView(matcher)— menemukan view.perform(action)— mengetuk, mengetik, menggulir.check(matches(...))— memastikan visibilitas, teks, dan keadaanRecyclerViewActionsuntuk interaksi dengan daftarIdlingResourceuntuk operasi asinkron- Nonaktifkan animasi sistem untuk mencegah pengujian yang tidak stabil
Berikutnya: men-debug dan membuat profil aplikasi Anda seperti seorang profesional.
Belajar Kotlin dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 36
- Pelajaran
- 152
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengujian Antarmuka dengan Espresso” gratis?
Ya — teks lengkap “Pengujian Antarmuka dengan Espresso” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Android Academy, upgrade ke CoddyKit PRO. Kursus Android Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pengujian Antarmuka dengan Espresso”?
Tulis pengujian antarmuka otomatis dengan Espresso. Temukan view dengan onView(), berinteraksilah menggunakan perform(), periksa status dengan check(), dan uji interaksi RecyclerView. Kamu berlatih Android Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Android Academy?
Tidak diperlukan pengalaman sebelumnya. Android Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pengujian Antarmuka dengan Espresso” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Android Academy ini?
Ya. Setiap pelajaran Android Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pengujian Unit dengan JUnit
- Mocking dengan Mockito
- Pengujian Antarmuka dengan Espresso
- Debugging & Pembuatan Profil