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 ne dispose pas d'écran comme un émulateur, et certaines API ne sont que partiellement compatibles. 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 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 de l'interface utilisateur isolés pour les tests de composants, de fonctionnalités ou d'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écessiteront toujours des tests sur l'appareil, par exemple ceux liés à l'interface utilisateur du système, comme le mode plein écran ou Picture-in-picture, ou lorsque vous vous appuyez sur des fonctionnalités non compatibles, comme WebView
.