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üfenRecyclerViewActionsfür Interaktionen mit ListenIdlingResourcefü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
- Unit-Tests mit JUnit
- Mocking mit Mockito
- UI-Tests mit Espresso
- Debugging und Profiling