Android Academy · Pelajaran

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.

Pelajaran 3 dari 413 langkah

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 keadaan
  • RecyclerViewActions untuk interaksi dengan daftar
  • IdlingResource untuk operasi asinkron
  • Nonaktifkan animasi sistem untuk mencegah pengujian yang tidak stabil

Berikutnya: men-debug dan membuat profil aplikasi Anda seperti seorang profesional.

Gratis untuk memulai

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

  1. Pengujian Unit dengan JUnit
  2. Mocking dengan Mockito
  3. Pengujian Antarmuka dengan Espresso
  4. Debugging & Pembuatan Profil
← Kembali ke Android Academy