Test de capture d'écran de l'aperçu Compose

Les tests de captures d'écran sont un moyen efficace de vérifier l'apparence de votre UI pour les utilisateurs. L'outil de test des captures d'écran d'aperçu Compose combine la simplicité et les fonctionnalités des aperçus de composables avec les gains de productivité liés à l'exécution de tests de capture d'écran côté hôte. Les tests de captures d'écran de l'aperçu de Compose sont conçus pour être aussi faciles à utiliser que les aperçus de composables.

Un test de capture d'écran est un test automatisé qui prend une capture d'écran d'un élément de l'interface utilisateur, puis la compare à une image de référence précédemment approuvée. Si les images ne correspondent pas, le test échoue et génère un rapport HTML pour vous aider à comparer et à trouver les différences.

Avec l'outil de test des captures d'écran de l'aperçu Compose, vous pouvez:

  • Utilisez @PreviewTest pour créer des tests de capture d'écran pour les aperçus de composables existants ou nouveaux.
  • Générez des images de référence à partir de ces aperçus de composables.
  • Générez un rapport HTML qui identifie les modifications apportées à ces aperçus après avoir modifié le code.
  • Utilisez des paramètres @Preview, tels que uiMode ou fontScale, et plusieurs aperçus pour vous aider à faire évoluer vos tests.
  • Modifiez vos tests avec le nouvel ensemble de sources screenshotTest.
Figure 1. Exemple de rapport HTML.

Conditions requises

Pour utiliser les tests de capture d'écran de la version Preview de Compose, vous avez besoin des éléments suivants:

  • Plug-in Android Gradle 8.5.0-beta01 ou version ultérieure
  • Kotlin 1.9.20 ou version ultérieure Nous vous recommandons d'utiliser Kotlin 2.0 ou une version ultérieure afin de pouvoir utiliser le plug-in Gradle du compilateur Compose.
  • Compose est activé pour votre projet. Nous vous recommandons d'activer Compose à l'aide du plug-in Gradle du compilateur Compose.

Configuration

Pour activer l'outil, procédez comme suit:

  1. Ajoutez le plug-in com.android.compose.screenshot, version 0.0.1-alpha10, à votre projet.
    1. Ajoutez le plug-in au fichier de catalogues de versions:
      [versions]
      agp = "8.11.0-alpha06"
      kotlin = "2.1.20"
      screenshot = "0.0.1-alpha10"
      
      [plugins]
      screenshot = { id = "com.android.compose.screenshot", version.ref = "screenshot"}
    2. Dans le fichier build.gradle.kts au niveau du module, ajoutez le plug-in dans le bloc plugins {}:
      plugins {
          alias(libs.plugins.screenshot)
      }
  2. Activez la propriété expérimentale dans le fichier gradle.properties de votre projet.
    android.experimental.enableScreenshotTest=true
  3. Dans le bloc android {} de votre fichier build.gradle.kts au niveau du module, activez l'indicateur expérimental pour utiliser l'ensemble de sources screenshotTest.
    android {
        experimentalProperties["android.experimental.enableScreenshotTest"] = true
    }
    
  4. Ajoutez les dépendances screenshot-validation-api et ui-tooling.
    1. Ajoutez-les à vos catalogues de versions:
      [libraries]
      screenshot-validation-api = { group = "com.android.tools.screenshot", name = "screenshot-validation-api", version.ref = "screenshot"}
      androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling"}
    2. Ajoutez-les à votre fichier build.gradle.kts au niveau du module:
      dependencies {
        screenshotTestImplementation(libs.screenshot.validation.api)
        screenshotTestImplementation(libs.androidx.ui.tooling)
      }

Désigner des aperçus de composables à utiliser pour les tests de captures d'écran

Pour désigner les aperçus de composables que vous souhaitez utiliser pour les tests de capture d'écran, marquez-les avec l'annotation @PreviewTest. Les aperçus doivent se trouver dans le nouvel ensemble de sources screenshotTest, par exemple app/src/screenshotTest/kotlin/com/example/yourapp/ExamplePreviewScreenshotTest.kt.

Vous pouvez ajouter d'autres composables et/ou des aperçus, y compris des aperçus multiples, dans ce fichier ou dans d'autres fichiers créés dans le même ensemble de sources.

package com.example.yourapp

import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import com.android.tools.screenshot.PreviewTest
import com.example.yourapp.ui.theme.MyApplicationTheme

@PreviewTest
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    MyApplicationTheme {
        Greeting("Android!")
    }
}

Générer des images de référence

Une fois que vous avez configuré une classe de test, vous devez générer des images de référence pour chaque aperçu. Ces images de référence permettent d'identifier les modifications ultérieurement, après avoir apporté des modifications au code. Pour générer des images de référence pour vos tests de capture d'écran d'aperçu de composable, exécutez la tâche Gradle suivante:

  • Linux et macOS: ./gradlew updateDebugScreenshotTest (./gradlew :{module}:update{Variant}ScreenshotTest)
  • Windows: gradlew updateDebugScreenshotTest (gradlew :{module}:update{Variant}ScreenshotTest)

Une fois la tâche terminée, recherchez les images de référence dans app/src/screenshotTestDebug/reference ({module}/src/screenshotTest{Variant}/reference).

Générer un rapport de test

Une fois les images de référence créées, exécutez la tâche de validation pour prendre une nouvelle capture d'écran et la comparer à l'image de référence:

  • Linux et macOS: ./gradlew validateDebugScreenshotTest (./gradlew :{module}:validate{Variant}ScreenshotTest)
  • Windows: gradlew validateDebugScreenshotTest (gradlew :{module}:validate{Variant}ScreenshotTest)

La tâche de validation crée un rapport HTML à l'emplacement {module}/build/reports/screenshotTest/preview/{variant}/index.html.

Problèmes connus

Vous trouverez la liste actuelle des problèmes connus dans le composant de suivi des problèmes de l'outil. Signalez tout autre commentaire et problème via l'outil de suivi des problèmes.

Mises à jour des versions

Notes de version et modifications apportées aux versions en cours.

0.0.1-alpha10

Cette version introduit les éléments suivants:

  • À partir de cette version, vous devez marquer toutes vos fonctions d'aperçu avec l'annotation @PreviewTest. Les aperçus sans annotation ne seront pas exécutés.

  • Le répertoire d'images de référence est passé de {module}/src/{variant}/screenshotTest/reference à {module}/src/screenshotTest{Variant}/reference. Cela permet de s'assurer que ces images de référence générées ne feront pas partie du code de production et d'être aligné sur la structure de répertoire des autres types de tests.

  • La tâche {variant}PreviewScreenshotRender est supprimée. Le rendu d'image est migré vers le moteur de test JUnit.

  • La tâche update{Variant}ScreenshotTest compare les nouvelles images de rendu aux images de référence avant la mise à jour. Il ne met à jour que les images dont les différences sont supérieures à un seuil spécifié. L'indicateur de ligne de commande --updateFilter a été supprimé.

0.0.1-alpha06

Cette version introduit les éléments suivants:

Seuil de différence d'image: ce nouveau paramètre de seuil global vous permet de mieux contrôler les comparaisons de captures d'écran. Pour configurer, mettez à jour le fichier build.gradle.kts de votre module:

android {
    testOptions {
        screenshotTests {
            imageDifferenceThreshold = 0.0001f // 0.01%
        }
    }
}

Ce seuil s'appliquera à tous les tests de capture d'écran définis dans le module.

  • Correction de bugs: correction de certains bugs du moteur de rendu Compose et prise en charge des compositions vides
  • Améliorations des performances: l'algorithme de comparaison des images a été mis à jour pour être plus rapide