Tests unitaires avec Glance

L'API de test unitaire Glance vous permet de tester votre code Glance sans gonfler les vues ni avoir besoin d'un UI Automator. Par exemple, l'API de test unitaire vous permet de vérifier des conditions, comme la présence d'éléments dans une liste ou la sélection de cases à cocher, à l'aide de matchers tels que hasContentDescriptionEqualTo ou isChecked.

Cette API est légère et nécessite moins de configuration. Vous pouvez donc effectuer un développement piloté par les tests à mesure que vous développez des éléments individuels de votre widget et les organisez pour améliorer la réutilisation du code.

Configuration

Les dépendances requises pour utiliser la bibliothèque de tests unitaires sont indiquées dans les exemples suivants :

// Other Glance and Compose runtime dependencies.
...
testImplementation 'androidx.glance:glance-testing:1.1.1'
testImplementation 'androidx.glance:glance-appwidget-testing:1.1.1'
...
// You may include additional dependencies, such as Robolectric, if your test
// needs to set a LocalContext.

Structure du test

Organisez les fonctions composables en dehors de la classe GlanceAppWidget pour permettre la réutilisation du code et les tests unitaires. Réduisez autant que possible la complexité de vos unités testées.

Vous pouvez cibler un composable de test avec provideComposable et exécuter vos tests unitaires sur un ou plusieurs nœuds Glance avec onNode ou onAllNodes, respectivement.

private const val FAKE_HEADLINE = "EXTRA! EXTRA! READ ALL ABOUT IT!"

class MyGlanceComposableTest {
    @Test
    fun myNewsItemComposable_largeSize_hasHeadline() = runGlanceAppWidgetUnitTest {
        // Set the composable to test
        provideComposable {
            MyNewsItemComposable(FAKE_HEADLINE)
        }

        // Perform assertions
        onNode(hasTestTag("headline"))
            .assertHasText(FAKE_HEADLINE)
    }


    @Composable
    fun MyNewsItemComposable(headline: String) {
        Row {
            Text(
                text = headline,
                modifier = GlanceModifier.semantics { testTag = "headline" },
            )
        }
    }
}

Définir le contexte et la taille du test

Si votre fonction composable lit le contexte à l'aide de la méthode LocalContext.current(), vous devez définir un contexte à l'aide de setContext(). Sinon, cette étape est facultative.

Vous pouvez utiliser n'importe quel framework de test unitaire Android basé sur JVM, tel que Robolectric, pour fournir le contexte.

Si votre fonction composable accède à LocalSize, définissez la taille prévue pour le test avant de fournir un composable dans le test. La taille par défaut est de 349 dp x 455 dp, ce qui équivaut à un widget 5x4 affiché sur un appareil Pixel 4 en mode Portrait.

  • Si votre AppWidget utilise sizeMode == Single, vous pouvez définir cette valeur sur minWidth et minHeight dans le fichier info.xml de votre widget.
  • Si votre AppWidget utilise sizeMode == Exact, vous pouvez identifier les tailles à tester de la même manière que vous déterminez la taille de votre widget et identifier les tailles paysage et portrait sur lesquelles votre widget peut apparaître, puis les tester.
  • Si votre AppWidget utilise sizeMode == Responsive, vous pouvez définir cette valeur sur l'une des tailles de la liste que vous fournissez lorsque vous spécifiez sizeMode.

La durée par défaut du délai d'attente d'un test est de 1 seconde, mais vous pouvez transmettre une durée personnalisée en tant qu'argument à la méthode runGlanceAppWidgetUnitTest si votre infrastructure de test applique un délai d'attente différent.

Pour en savoir plus et obtenir des exemples de code, consultez la documentation de référence sur runGlanceAppWidgetUnitTest.