0Pricing
Android Academy · Lektion

UI-Tests mit Espresso

Schreiben Sie automatisierte UI-Tests mit Espresso. Finden Sie Views mit onView(), interagieren Sie mit perform(), prüfen Sie Zustände mit check() und testen Sie Interaktionen mit RecyclerView.

UI-Tests mit Espresso ist eine kostenlose Android Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Android Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Android Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist Espresso?

Espresso ist das offizielle UI-Test-Framework von Android. Damit können Sie Tests schreiben, die mit der UI Ihrer App interagieren — Schaltflächen antippen, Text eingeben, Listen scrollen — und überprüfen, was auf dem Bildschirm angezeigt wird.

Espresso läuft auf einem Gerät oder Emulator (instrumentierter Test) und synchronisiert sich automatisch mit dem UI-Thread — unzuverlässige sleep()-Aufrufe sind nicht erforderlich.

Einrichtung

Espresso ist im Android-Test-Toolkit enthalten. Fügen Sie diese Abhängigkeiten zu app/build.gradle hinzu:

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

Verwenden Sie ActivityScenarioRule, um vor jedem Test eine Activity zu starten und sie danach zu schließen:

@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() und ViewMatchers

onView(matcher) findet eine View in der aktuellen Hierarchie. Kombinieren Sie Matcher für eine präzise Auswahl:

// 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 — Mit Views interagieren

Führen Sie nach dem Finden einer View mit .perform() eine Aktion aus:

// 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 — Zustand überprüfen

Überprüfen Sie mit .check(), was auf dem Bildschirm angezeigt wird:

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

Vollständiger Login-Test

Ein vollständiger Test, der Anmeldedaten eingibt und auf „Anmelden“ tippt:

@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!")))
}

RecyclerView testen

Verwenden Sie RecyclerViewActions aus espresso-contrib, um mit Listenelementen zu interagieren:

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

Eingabevalidierung testen

Überprüfen Sie, dass Fehlermeldungen angezeigt werden, wenn die Eingabe ungültig ist:

@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"))))
}

Idling Resources

Espresso wartet automatisch, bis der UI-Thread inaktiv ist, aber nicht auf Netzwerkaufrufe oder Coroutines. Verwenden Sie IdlingResource, um Espresso anzuweisen, auf Ihre asynchronen Aufgaben zu warten:

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

Espresso-Tests ausführen

Führen Sie instrumentierte Tests auf einem verbundenen Gerät oder Emulator aus:

  • In Android Studio: Klicken Sie mit der rechten Maustaste auf eine Testklasse → Ausführen
  • Über das Terminal: ./gradlew connectedAndroidTest
  • Die Ergebnisse finden Sie in app/build/reports/androidTests/

Verwenden Sie den Android-Emulator mit API 28 oder höher, um stabile und schnelle Testläufe zu erhalten. Deaktivieren Sie Animationen in den Entwicklereinstellungen, um instabile Tests zu vermeiden.

Kurze Überprüfung

Welches Espresso-Muster ist korrekt, um eine View zu finden und ihren Text zu überprüfen?

Zusammenfassung: UI-Tests mit Espresso

Automatisierte UI-Tests erkennen Regressionen, bevor es die Benutzer tun:

  • onView(matcher) — eine View finden
  • .perform(action) — tippen, Text eingeben, scrollen
  • .check(matches(...)) — Sichtbarkeit, Text und Zustand überprüfen
  • RecyclerViewActions für Interaktionen mit Listen
  • IdlingResource für asynchrone Vorgänge
  • Systemanimationen deaktivieren, um instabile Tests zu vermeiden

Als Nächstes: Ihre App professionell debuggen und profilieren.

Häufig gestellte Fragen

Ist die Lektion „UI-Tests mit Espresso“ kostenlos?

Ja — der vollständige Text von „UI-Tests mit Espresso“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Android Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Android Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „UI-Tests mit Espresso“?

Schreiben Sie automatisierte UI-Tests mit Espresso. Finden Sie Views mit onView(), interagieren Sie mit perform(), prüfen Sie Zustände mit check() und testen Sie Interaktionen mit RecyclerView. Du übst Android Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Android Academy zu starten?

Keine Vorkenntnisse erforderlich. Android Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „UI-Tests mit Espresso“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Android Academy-Lektion Code schreiben und ausführen?

Ja. Jede Android Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Unit-Tests mit JUnit
  2. Mocking mit Mockito
  3. UI-Tests mit Espresso
  4. Debugging und Profiling
← Zurück zu Android Academy