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 : 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’étatRecyclerViewActionspour les interactions avec les listesIdlingResourcepour 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
- Tests unitaires avec JUnit
- Simulation avec Mockito
- Tests d’interface avec Espresso
- Débogage et profilage