Espresso — co to je, principy fungování a jak používat

Autor: IT Sectr Publikováno: 2026-04-08 Doba čtení: 8 min

Espresso je framework pro automatizované UI testování Android aplikací, vyvinutý týmem Google a součástí AndroidX Test. Na rozdíl od instrumentálních testů, které kontrolují izolované komponenty, Espresso interaguje se skutečným UI: mačke tlačítka, zadává text, kontroluje zobrazení prvků. Podle Google Android Developers Espresso poskytuje automatickou synchronizaci s UI vláknem, což eliminuje potřebu ručního Thread.sleep().

Hlavní body

  • Espresso — framework pro UI testování Androidu s automatickou synchronizací vláken.
  • ViewMatcher — vyhledávání View prvku na obrazovce podle ID, textu, rodičovské hierarchie.
  • ViewAction — akce nad prvkem: kliknutí, zadání textu, swipnutí.
  • ViewAssertion — kontrola stavu prvku: zobrazuje se, obsahuje text, je aktivní.
  • Idling Resource — mechanizmus čekání na dokončení asynchronních operací před kontrolou UI.

Co je Espresso?

Espresso je knihovna pro psaní automatizovaných UI testů pro Android, která je součástí Google AndroidX Test. Poskytuje API pro vyhledávání View prvků na obrazovce, provádění akcí na nich (kliknutí, zadání, swipnutí) a kontrolu jejich stavu (zobrazuje se, obsahuje text, je aktivní).

Klíčovou vlastností Espressa je automatická synchronizace s hlavním vláknem aplikace. Framework čeká na dokončení všech asynchronních úkolů (corutiny, AsyncTask, Handler) před provedením další kontroly. To eliminuje flaky testy související s race condition a dělá UI testy stabilními a spolehlivými — žádný test neobsahuje Thread.sleep() nebo čekací smyčky.

Espresso následuje princip Three-Legged Dog — test se skládá ze tří kroků: najít prvek (ViewMatcher), provést akci (ViewAction), zkontrolovat výsledek (ViewAssertion). Všechny tři kroky se zapisují do řetězce volání onView().perform().check(). Tento koncept dělá testy předvídatelnými a snadno čitelnými — každý test jasně popisuje, co hledá, co dělá a co kontroluje.

Jak funguje Espresso

Architektura Espressa je založena na třech komponentách: Espresso (vstupní bod — statické metody onView a onData), ViewMatchers (vyhledávání prvků), ViewActions (akce) a ViewAssertions (kontroly). Uvnitř framework používá Idling Resource pro synchronizaci s UI vláknem.

Základní Espresso test

Nejjednodušší test najde tlačítko podle ID, provede kliknutí a zkontroluje, zda se objevil text „Hotovo“. Všechny operace se provádějí synchronně z pohledu testu — Espresso zaručuje, že UI vlákno dokončilo zpracování události dříve, než test pokračuje v provádění. Toho je dosaženo vestavěným mechanizmem čekání: onView blokuje provádění testu, dokud UI není stabilní.

kotlin
@Test
fun buttonClick_showsSuccessText() {
    // Najít tlačítko podle ID a kliknout
    onView(withId(R.id.button_submit))
        .perform(click())

    // Zkontrolovat, že se text „Hotovo“ zobrazuje
    onView(withText("Hotovo"))
        .check(matches(isDisplayed()))
}

Pravidlo ActivityScenario

Pro spuštění Espresso testu se používá ActivityScenario (AndroidX Test), který vytváří Activity v požadovaném stavu — spuštěná, pozastavená, zničená. ActivityScenario umožňuje testování životního cyklu Activity vedle čistého UI. Například lze zkontrolovat, že data jsou uložena při otočení obrazovky (rekreace Activity) a obnovena po zničení.

ViewMatchers jsou sada metod ze třídy Espresso.onView, které umožňují najít View na obrazovce podle různých kritérií: identifikátoru zdroje (R.id), textu, hint nápovědy, rodičovského prvku a hierarchie. Pokud jeden matcher nedává jedinečný výsledek, matchery se kombinují prostřednictvím allOf().

MatcherÚčel
withId(R.id.name)Vyhledávání podle ID zdroje
withText(„text“)Vyhledávání podle zobrazeného textu
withHint(„nápověda“)Vyhledávání podle hint atributu EditTextu
isDisplayed()Kontrola, zda je prvek viditelný na obrazovce
hasSibling(matcher)Vyhledávání podle sousedního prvku
allOf(m1, m2)Kombinace více matcherů

Kombinace matcherů

Pokud je na obrazovce několik stejných prvků (například dva TextView s různým textem), je vhodné kombinovat matchery pomocí allOf: onView(allOf(withId(R.id.title), withText(„Ahoj“))). To zaručuje výběr jedinečného prvku. Opačný operátor — not() — vylučuje prvky z vyhledávání a hasSibling() hledá prvek vedle známého.

ViewActions: interakce s UI

ViewActions jsou akce, které Espresso provádí nad nalezeným View: click(), typeText(), clearText(), scrollTo(), swipeLeft() a další. Akce se předávají metodě perform(), která může přijmout několik akcí za sebou.

Řetězec akcí

Metoda perform() přijímá vararg ViewAction, což umožňuje provést sekvenci akcí nad jedním prvkem: vyčistit pole, zadat nový text, zavřít klávesnici a stisknout tlačítko. Všechny akce se provádějí v pořadí, v jakém jsou uvedeny, a Espresso zaručuje, že předchozí akce byla dokončena před zahájením následující.

kotlin
// Zadání textu do EditTextu a stisknutí tlačítka
onView(withId(R.id.edit_email))
    .perform(
        clearText(),
        typeText("user@example.com"),
        closeSoftKeyboard()
    )

onView(withId(R.id.button_login))
    .perform(click())

Kontrola pomocí onData

Pro prvky uvnitř AdapterView (ListView, RecyclerView) se místo onView používá metoda onData(). Pracuje s daty adaptéru, nikoli s View — najde prvek podle obsahu modelu a vrátí odpovídající View pro další akce. onData používá hamcrest matchery k nalezení prvku podle polí datového modelu.

ViewAssertions: kontrola stavu

ViewAssertions kontrolují, zda je View v určitém stavu. Základní metoda — matches(matcher) — kontroluje, zda prvek odpovídá zadanému matcheru. Doplňkově Espresso nabízí doesNotExist() (prvek neexistuje) a selectedDescendantsMatch() (kontrola vnořených prvků).

Typické kontroly

Nejčastější kontroly v UI testech: prvek se zobrazuje (isDisplayed), prvek obsahuje určitý text (withText), prvek je aktivní (isEnabled), prvek není vybrán (isNotChecked). Každá kontrola v případě neúspěchu vyhodí podrobnou výjimku — s uvedením hierarchie View na obrazovce. To zjednodušuje ladění: v chybové zprávě je vidět, které prvky byly skutečně na obrazovce v okamžiku kontroly.

Vlastní ViewAssertions

Pokud standardní kontroly nestačí, lze vytvořit vlastní pomocí rozhraní ViewAssertion. Vlastní assertion obdrží View a může kontrolovat jeho stav programově — například barvu textu, okraje nebo stav vlastní komponenty, která není vystavena prostřednictvím standardních matcherů.

kotlin
// Kontrola: TextView se zobrazuje a obsahuje text
onView(withId(R.id.text_welcome))
    .check(matches(isDisplayed()))
    .check(matches(withText("Vítejte")))

// Kontrola: prvek se NEzobrazuje
onView(withId(R.id.progress_bar))
    .check(doesNotExist())

Idling Resources pro asynchronní operace

Idling Resource je mechanizmus Espressa pro synchronizaci testu s asynchronními operacemi. Ve výchozím nastavení Espresso čeká na dokončení Handler, AsyncTask a corutin (prostřednictvím coroutinesIdlingResource). Pokud aplikace provádí práci na pozadí prostřednictvím vlastních vláken nebo Callback služeb, je třeba zaregistrovat vlastní Idling Resource.

Příklad s corutinami

Od AndroidX Test 1.4.0 Espresso podporuje corutiny pomocí CoroutinesIdlingResource. Test automaticky čeká na dokončení všech spuštěných corutin před provedením UI kontrol. Pro složitější scénáře se používá CountingIdlingResource — počítadlo, které se zvyšuje při zahájení úkolu a snižuje při dokončení.

kotlin
// Registrace IdlingResource pro 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
    }
}

Nastavení Espressa v Android projektu

Připojení Espressa v Android projektu se provádí přidáním závislostí do build.gradle na úrovni modulu. Espresso je součástí AndroidX Test, takže staāí uést závislosti pro jádro Espressa, rozšíření a JUnit integraci. Testy jsou umístěny v adresáři src/androidTest a spouštějí se na fyzickém zařízení nebo emulátoru pomocí AndroidJUnitRunner.

Konfigurace Gradle

Minimální sada závislostí zahrnuje espresso-core (jádro), espresso-contrib (další matchery pro RecyclerView, Drawer, Picker) a runner (testovací runner AndroidX). Všechny testy se spouštějí na emulátoru nebo fyzickém zařízení pomocí 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")
}

Spouštění testů na CI

Espresso testy lze spouštět pomocí Google Android Test Orchestrator, který izoluje každý test v samostatném procesu a čistí stav mezi spuštěními. To eliminuje flaky testy související se zbytkovými daty předchozích testů a zvyšuje stabilitu na CI serverech. Pro paralelní spouštění se používá sharding — rozdělení testů mezi více emulátorů.

Často kladené otázky

Čím se Espresso liší od UI Automatoru?

Espresso pracuje uvnitř procesu aplikace a používá automatickou synchronizaci s UI vláknem. UI Automator pracuje na úrovni systému, může interagovat s jinými aplikacemi, ale vyžaduje ruční správu čekání.

Proč se Espresso nazývá framework s „třínohým psem“?

Je to metafora z prezentace Google: test Espresso stojí na třech pilířích — ViewMatcher (hledání), ViewAction(akce) a ViewAssertion(kontrola). Pokud se odstraní kterýkoli z nich, test ztrácí stabilitu, jako třínohý pes.

Jak testovat RecyclerView pomocí Espressa?

Pro RecyclerView se používá knihovna espresso-contrib a metody onView(withId(R.id.recycler)).perform(actionOnItemAtPosition(0, click())). Alternativa — onData() pro AdapterView nebo vlastní ViewAction pro vyhledání prvku podle textu uvnitř RecyclerView. Doplňkově lze použít RecyclerViewActions z espresso-contrib pro rolání k prvku a akce na něm.

Co je flaky test a jak s ním Espresso bojuje?

Flaky test je test, který občas selhává bez změny kódu, kvůli race condition nebo asynchronnosti. Espresso řeší tento problém pomocí Idling Resource — čekání na dokončení všech úkolů na pozadí před provedením kontroly.

Lze použít Espresso pro screenshot testování?

Samotné Espresso není určeno pro screenshot testy, ale lze jej kombinovat s knihovnami jako Shot nebo Paparazzi. Espresso připraví UI do požadovaného stavu a knihovna pro porovnání pořídí screenshot a porovná jej s referencí. Tento přístup se nazývá vizuální regresní testování a pomáhá najít neočekávané změny v rozhraní.

Shrnutí

  • Espresso — framework pro UI testování Androidu od Google s automatickou synchronizací.
  • ViewMatchers — API pro vyhledávání prvků podle ID, textu, hierarchie a kombinací.
  • ViewActions — click, typeText, scrollTo, swipe pro interakci s UI.
  • ViewAssertions — matches, doesNotExist pro kontrolu stavu prvků.
  • Idling Resource — synchronizace testu s asynchronními operacemi a corutinami.
  • Tři kroky — onView().perform().check() = najdi, udělej, zkontroluj.
  • AndroidX Test — knihovny pro spouštění instrumentálních testů na emulátoru nebo zařízení.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také