Stratégies Robolectric

Robolectric est un framework Open Source géré par Google qui vous permet d'exécuter des tests dans un environnement Android simulé dans une JVM, sans les coûts et les instabilités d'un émulateur. Il est compatible avec toutes les versions d'Android depuis Lollipop (niveau d'API 21).

De nombreux grands projets utilisent Robolectric pour accélérer et fiabiliser leurs tests, et réduire les dépenses associées à l'exécution de tests sur des appareils réels ou des émulateurs. Cela inclut la plupart des applications Google qui reposent fortement sur Robolectric.

Robolectric ne remplace pas complètement un émulateur, car il n'est pas compatible avec toutes les fonctionnalités et API. Par exemple, Robolectric n'a pas d'écran comme le fait un émulateur, et certaines API ne sont que partiellement prises en charge. Toutefois, il émule suffisamment de parties d'Android pour exécuter de manière fiable des tests unitaires et la plupart des tests d'interface utilisateur.

Stratégies de test

Vous pouvez utiliser deux types de stratégies de test avec Robolectric: les tests unitaires et les tests d'interface utilisateur.

Tests unitaires

Robolectric a été conçu pour permettre les "tests unitaires" dans les applications Android. Par exemple, vous pouvez simuler le lancement d'une activité et tester la logique qu'elle contient, en appelant toutes les méthodes de cycle de vie.

Vous pouvez également utiliser les faux de Robolectric (appelés "ombres") comme dépendances pour les tests unitaires. Par exemple, si votre classe utilise un bundle ou si vous devez simuler une connexion Bluetooth.

En général, si vous implémentez une architecture testable, vous n'avez pas besoin d'utiliser Robolectric pour les tests unitaires, car votre code doit être testable de manière isolée, sans dépendances sur le framework Android.

Test de l'interface utilisateur

Robolectric peut également exécuter des tests d'interface utilisateur tels que des tests Espresso ou Compose. Vous pouvez convertir un test instrumenté en test Robolectric en le déplaçant vers l'ensemble de sources test et en configurant les dépendances Robolectric.

android {
  testOptions {
    unitTests {
      isIncludeAndroidResources = true
    }
  }
}

dependencies {
  testImplementation("junit:junit:4.13.2")
  testImplementation("org.robolectric:robolectric:4.13")
}

Tout test d'interface utilisateur présent dans l'ensemble de sources test s'exécute avec Robolectric.

import androidx.test.espresso.Espresso.onView

@RunWith(AndroidJUnit4::class)
class AddContactActivityTest {
    @Test
    fun inputTextShouldBeRetainedAfterActivityRecreation() {
        // GIVEN
        val contactName = "Test User"
        val scenario = ActivityScenario.launchActivity<AddContactActivity>()

        // WHEN
        // Enter contact name
        onView(withId(R.id.contact_name_text))
            .perform(typeText(contactName))
        // Destroy and recreate Activity
        scenario.recreate()

        // THEN
        // Check contact name was preserved.
        onView(withId(R.id.contact_name_text))
            .check(matches(withText(contactName)))
     }
}

La plupart des tests d'interface utilisateur n'interagissent pas avec le framework et vous pouvez les exécuter sur Robolectric. Vous pouvez exécuter des tests de comportement sur Robolectric, car la fidélité requise est plus que suffisante. Par exemple, lorsqu'un test Compose vérifie que l'UI a changé après avoir cliqué sur un bouton.

Vous pouvez exécuter d'autres tests d'interface utilisateur avec Robolectric, tels que des tests de captures d'écran. Cependant, la fidélité est moindre, car les différents appareils affichent les écrans légèrement différemment.

Vous devez décider si l'implémentation de Robolectric est suffisante pour chaque cas d'utilisation, mais voici quelques recommandations:

  • Utilisez Robolectric pour les tests de comportement isolé de l'interface utilisateur afin de tester des composants, des fonctionnalités ou des applications. En général, ces tests vérifient la gestion de l'état et le comportement des UI, et n'interagissent pas avec les dépendances externes.
  • Utilisez Robolectric pour prendre des captures d'écran lorsque la précision des pixels n'est pas essentielle. Par exemple, pour tester la réaction d'un composant à différentes tailles de police ou thèmes.

Remarque: Robolectric peut prendre des captures d'écran en mode natif, mais vous avez besoin d'une bibliothèque tierce pour effectuer des tests de capture d'écran avec elle.

Tests Robolectric par rapport aux tests sur l'appareil

En résumé, Robolectric offre une fidélité suffisante pour exécuter la plupart des tests d'interface utilisateur, mais certains cas nécessitent toujours des tests sur l'appareil, par exemple ceux liés à l'interface utilisateur du système (bord à bord ou Picture-in-picture, par exemple), ou lorsqu'il s'appuie sur des fonctionnalités non compatibles, comme WebView.