0Pricing
Android Academy · Leçon

Tests d’interface avec Espresso

Écrivez des tests automatisés d’interface avec Espresso. Recherchez les vues avec onView(), interagissez avec perform(), vérifiez leur état avec check() et testez les interactions avec RecyclerView.

Tests d’interface avec Espresso est une leçon Android Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Android Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Android Academy comprend 4 leçons au total.

Qu’est-ce qu’Espresso ?

Espresso est le framework officiel de test d’interface utilisateur d’Android. Il vous permet d’écrire des tests qui interagissent avec l’interface de votre application : appuyer sur des boutons, saisir du texte, faire défiler des listes, puis vérifier ce qui est affiché à l’écran.

Espresso s’exécute sur un appareil ou un émulateur (test instrumenté) et se synchronise automatiquement avec le thread d’interface utilisateur : aucun appel sleep() instable n’est nécessaire.

Configuration

Espresso est inclus dans l’outillage de test Android. Ajoutez ces dépendances à 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

Utilisez ActivityScenarioRule pour lancer une Activity avant chaque test et la fermer ensuite :

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

onView(matcher) recherche une vue dans la hiérarchie actuelle. Combinez plusieurs critères pour plus de précision :

// 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 — interagir avec les vues

Après avoir trouvé une vue, effectuez une action avec .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 — vérifier l’état

Vérifiez ce qui est affiché à l’écran avec .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())

Test complet de connexion

Un test complet qui saisit les identifiants et appuie sur le bouton de connexion :

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

Tester RecyclerView

Utilisez RecyclerViewActions de espresso-contrib pour interagir avec les éléments d’une liste :

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

Tester la validation des entrées

Vérifiez que des messages d’erreur apparaissent lorsque les entrées sont invalides :

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

Ressources d’inactivité

Espresso attend automatiquement que le thread d’interface utilisateur soit inactif, mais pas la fin des appels réseau ou des coroutines. Utilisez IdlingResource pour indiquer à Espresso d’attendre votre travail asynchrone :

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

Exécuter les tests Espresso

Exécutez les tests instrumentés sur un appareil connecté ou un émulateur :

  • Dans Android Studio : cliquez avec le bouton droit sur une classe de test → Exécuter
  • Depuis le terminal : ./gradlew connectedAndroidTest
  • Les résultats apparaissent dans app/build/reports/androidTests/

Utilisez l’émulateur Android API 28 ou version ultérieure pour des exécutions stables et rapides. Désactivez les animations dans les options développeur afin d’éviter les résultats instables.

Vérification rapide

Quel est le schéma Espresso correct pour rechercher une vue et vérifier son texte ?

Récapitulatif&nbsp;: tests d’interface utilisateur avec Espresso

Les tests automatisés de l’interface détectent les régressions avant les utilisateurs :

  • onView(matcher) — rechercher une vue
  • .perform(action) — appuyer, saisir du texte, faire défiler
  • .check(matches(...)) — vérifier la visibilité, le texte et l’état
  • RecyclerViewActions pour les interactions avec les listes
  • IdlingResource pour les opérations asynchrones
  • Désactivez les animations système pour éviter les tests instables

Ensuite : déboguer et analyser les performances de votre application comme un professionnel.

Questions Fréquemment Posées

La leçon « Tests d’interface avec Espresso » est-elle gratuite ?

Oui — le texte complet de « Tests d’interface avec Espresso » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Android Academy, passe à CoddyKit PRO. Le cours Android Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Tests d’interface avec Espresso » ?

Écrivez des tests automatisés d’interface avec Espresso. Recherchez les vues avec onView(), interagissez avec perform(), vérifiez leur état avec check() et testez les interactions avec RecyclerView. Tu pratiques Android Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Android Academy ?

Aucune expérience préalable n'est requise. Android Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Tests d’interface avec Espresso » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Android Academy ?

Oui. Chaque leçon Android Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Tests unitaires avec JUnit
  2. Simulation avec Mockito
  3. Tests d’interface avec Espresso
  4. Débogage et profilage
← Retour à Android Academy