Schémas courants

Vous pouvez tester votre application Compose avec des approches et des modèles bien établis.

Effectuer un test isolé

ComposeTestRule vous permet de démarrer une activité affichant n'importe quel composable : votre application complète, un seul écran ou un petit élément. Il est également recommandé de vérifier que vos composables sont correctement encapsulés et qu'ils fonctionnent indépendamment, ce qui permet de tester l'interface utilisateur plus facilement et plus précisément.

Cela ne signifie pas que vous devez uniquement créer des tests d'interface utilisateur. Il est également très important de tester la portée de plus grandes parties de votre interface utilisateur.

Accédez à l'activité et aux ressources après avoir défini votre propre contenu

Souvent, vous devez définir le contenu testé à l'aide de composeTestRule.setContent et vous devez également accéder aux ressources d'activité, par exemple pour confirmer qu'un texte affiché correspond à une ressource de chaîne. Toutefois, vous ne pouvez pas appeler setContent sur une règle créée avec createAndroidComposeRule() si l'activité l'appelle déjà.

Pour ce faire, un modèle courant consiste à créer un AndroidComposeTestRule à l'aide d'une activité vide telle que ComponentActivity.

class MyComposeTest {

    @get:Rule
    val composeTestRule = createAndroidComposeRule<ComponentActivity>()

    @Test
    fun myTest() {
        // Start the app
        composeTestRule.setContent {
            MyAppTheme {
                MainScreen(uiState = exampleUiState, /*...*/)
            }
        }
        val continueLabel = composeTestRule.activity.getString(R.string.next)
        composeTestRule.onNodeWithText(continueLabel).performClick()
    }
}

Notez que ComponentActivity doit être ajouté au fichier AndroidManifest.xml de votre application. Activez cela en ajoutant cette dépendance à votre module:

debugImplementation("androidx.compose.ui:ui-test-manifest:$compose_version")

Propriétés de la sémantique personnalisée

Vous pouvez créer des propriétés sémantiques personnalisées pour exposer des informations aux tests. Pour ce faire, définissez un nouveau SemanticsPropertyKey et rendez-le disponible à l'aide de SemanticsPropertyReceiver.

// Creates a semantics property of type Long.
val PickedDateKey = SemanticsPropertyKey<Long>("PickedDate")
var SemanticsPropertyReceiver.pickedDate by PickedDateKey

Utilisez maintenant cette propriété dans le modificateur semantics:

val datePickerValue by remember { mutableStateOf(0L) }
MyCustomDatePicker(
    modifier = Modifier.semantics { pickedDate = datePickerValue }
)

À partir des tests, utilisez SemanticsMatcher.expectValue pour revendiquer la valeur de la propriété:

composeTestRule
    .onNode(SemanticsMatcher.expectValue(PickedDateKey, 1445378400)) // 2015-10-21
    .assertExists()

Vérifier la restauration d'état

Vérifiez que l'état de vos éléments Compose est correctement restauré lorsque l'activité ou le processus est recréé. Effectuez ces vérifications sans dépendre de la recréation d'activité avec la classe StateRestorationTester.

Cette classe vous permet de simuler la recréation d'un composable. Il est particulièrement utile de vérifier l'implémentation de rememberSaveable.


class MyStateRestorationTests {

    @get:Rule
    val composeTestRule = createComposeRule()

    @Test
    fun onRecreation_stateIsRestored() {
        val restorationTester = StateRestorationTester(composeTestRule)

        restorationTester.setContent { MainScreen() }

        // TODO: Run actions that modify the state

        // Trigger a recreation
        restorationTester.emulateSavedInstanceStateRestore()

        // TODO: Verify that state has been correctly restored.
    }
}

Tester différentes configurations d'appareil

Les applications Android doivent s'adapter à de nombreuses conditions changeantes: taille des fenêtres, paramètres régionaux, tailles de police, thèmes sombre et clair, etc. La plupart de ces conditions sont dérivées des valeurs au niveau de l'appareil contrôlées par l'utilisateur et exposées avec l'instance Configuration actuelle. Il est difficile de tester différentes configurations directement dans un test, car celui-ci doit configurer les propriétés au niveau de l'appareil.

DeviceConfigurationOverride est une API réservée aux tests qui vous permet de simuler différentes configurations d'appareil de manière localisée pour le contenu @Composable testé.

L'objet associé de DeviceConfigurationOverride possède les fonctions d'extension suivantes, qui remplacent les propriétés de configuration au niveau de l'appareil:

Pour appliquer un forçage spécifique, encapsulez le contenu testé dans un appel à la fonction de niveau supérieur DeviceConfigurationOverride(), en transmettant le forçage à appliquer en tant que paramètre.

Par exemple, le code suivant applique le forçage DeviceConfigurationOverride.ForcedSize() pour modifier la densité localement, forçant l'affichage du composable MyScreen dans une grande fenêtre en mode paysage, même si l'appareil sur lequel le test est exécuté n'est pas directement compatible avec cette taille de fenêtre:

composeTestRule.setContent {
    DeviceConfigurationOverride(
        DeviceConfigurationOverride.ForcedSize(DpSize(1280.dp, 800.dp))
    ) {
        MyScreen() // will be rendered in the space for 1280dp by 800dp without clipping
    }
}

Pour appliquer plusieurs forçages simultanément, utilisez DeviceConfigurationOverride.then():

composeTestRule.setContent {
    DeviceConfigurationOverride(
        DeviceConfigurationOverride.FontScale(1.5f) then
            DeviceConfigurationOverride.FontWeightAdjustment(200)
    ) {
        Text(text = "text with increased scale and weight")
    }
}

Autres ressources

  • Tester des applications sur Android: la page de destination principale pour les tests Android offre une vue plus large des principes de base et des techniques de test.
  • Principes de base des tests:découvrez les concepts fondamentaux qui sous-tendent le test d'une application Android.
  • Tests locaux:vous pouvez exécuter certains tests en local, sur votre propre poste de travail.
  • Tests d'instrumentation:il est également recommandé d'exécuter des tests d'instrumentation. c'est-à-dire des tests qui s'exécutent directement sur l'appareil.
  • Intégration continue:l'intégration continue vous permet d'intégrer vos tests dans votre pipeline de déploiement.
  • Testez différentes tailles d'écran:avec de nombreux appareils disponibles pour les utilisateurs, vous devez tester différentes tailles d'écran.
  • Espresso: bien qu'il soit destiné aux interfaces utilisateur basées sur les vues, la connaissance d'Espresso peut être utile pour certains aspects des tests Compose.