Annotations du kit de test
Le kit de test fournit des annotations utilitaires qui permettent d’exécuter des tests pour une posture ou un type d’appareil spécifique. Si vous devez tester des flux d’application complexes qui changent selon plusieurs postures, vous devez simuler une fonctionnalité de pliage ou utiliser des mouvements de balayage à la place.
Dans le cas de tests plus simples qui n’utilisent qu’une seule posture, vous pouvez utiliser des annotations pour :
- exécuter des tests en mode mono-écran ou double écran
- exécuter des tests sur des appareils cibles spécifiques
- exécuter des tests dans une orientation d’appareil spécifique
- exécuter des tests avec une fonctionnalité de simulation de pliage
Important
Ces annotations fonctionnent uniquement avec FoldableTestRule et FoldableJUnit4ClassRunner. Dans la section Composants du kit de test ci-dessous, vous trouverez des informations sur leur utilisation avec les annotations.
Configuration
Créez un fichier de classe de test dans le répertoire androidTest. C’est là que vous ajouterez les extraits de code pour les tests et les règles de test.
Vérifiez que vous disposez du référentiel
mavenCentral()
dans votre fichier build.gradle de premier niveau :allprojects { repositories { google() mavenCentral() } }
Ajoutez les dépendances suivantes au fichier build.gradle de niveau module (la version actuelle peut être différente de ce qui est illustré ici) :
androidTestImplementation "com.microsoft.device.dualscreen.testing:testing-kotlin:1.0.0-alpha4" androidTestImplementation "androidx.test.uiautomator:uiautomator:2.2.0" androidTestImplementation "androidx.test.espresso:espresso-core:3.4.0" androidTestImplementation "androidx.test:runner:1.4.0" androidTestImplementation "androidx.test:rules:1.4.0"
Vérifiez que
compileSdkVersion
ettargetSdkVersion
sont définis sur API 31 ou version ultérieure dans le fichier build.gradle au niveau du module :android { compileSdkVersion 31 defaultConfig { targetSdkVersion 31 } ... }
Créez un
TestRule
qui peut effectuer des vérifications d’interface utilisateur et simuler des fonctionnalités de repli. Pour ce faire, vous pouvez chaîner deux règles : une règleFoldableTestRule
et une règle ActivityScenarioRule ou AndroidComposeTestRule.Vous pouvez utiliser la méthode
foldableRuleChain
pour créer la chaîne de règles, ou vous pouvez créer votre propre chaîne de règles, comme indiqué dans l’exemple suivant :private val activityScenarioRule = activityScenarioRule<MainActivity>() private val foldableTestRule = FoldableTestRule() @get:Rule val testRule: TestRule = foldableRuleChain(activityScenarioRule, foldableTestRule)
or
private val uiDevice: UiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) private val activityScenarioRule = activityScenarioRule<MainActivity>() private val foldableTestRule = FoldableTestRule() @get:Rule val testRule: TestRule = if (uiDevice.isSurfaceDuo()) { RuleChain.outerRule(activityScenarioRule).around(foldableTestRule) } else { RuleChain.outerRule(foldableTestRule).around(activityScenarioRule) }
Si vous choisissez de créer votre propre chaîne de règles :
- Pour les appareils
SurfaceDuo
etSurfaceDuo2
,ActivityScenarioRule
doit être la règle externe, car l’application doit avoir démarré avant les opérations span/unspan. - Pour les autres appareils de type tablette,
FoldableTestRule
doit être la règle externe, car FoldingFeature doit être simulé avant le lancement de l’application.
- Pour les appareils
Si vous utilisez Espresso pour tester les affichages, veillez à désactiver les animations sur votre appareil.
Composants du kit de test
Important
Consultez les sections FoldableTestRule et FoldableJUnit4ClassRunner avant de commencer à utiliser les annotations suivantes.
SingleScreenTest/DualScreenTest
Ajoutez cette annotation pour la méthode de test ou la classe de test, si vous souhaitez exécuter le test en mode mono-écran/double écran. De plus, à l’aide du paramètre orientation
, vous pouvez exécuter le test dans l’orientation d’appareil spécifiée. Le paramètre orientation
peut avoir les valeurs suivantes : UiAutomation.ROTATION_FREEZE_0
, UiAutomation.ROTATION_FREEZE_90
, UiAutomation.ROTATION_FREEZE_180
, UiAutomation.ROTATION_FREEZE_270
@RunWith(FoldableJUnit4ClassRunner::class)
@SingleScreenTest(orientation = UiAutomation.ROTATION_FREEZE_180)
class TestSample {
private val activityScenarioRule = activityScenarioRule<MainActivity>()
private val foldableTestRule = FoldableTestRule()
@get:Rule
val testRule: TestRule = foldableRuleChain(activityScenarioRule, foldableTestRule)
@Test
fun sampleTestMethod() {
}
}
or
@RunWith(FoldableJUnit4ClassRunner::class)
class TestSample {
private val activityScenarioRule = activityScenarioRule<MainActivity>()
private val foldableTestRule = FoldableTestRule()
@get:Rule
val testRule: TestRule = foldableRuleChain(activityScenarioRule, foldableTestRule)
@Test
@SingleScreenTest(orientation = UiAutomation.ROTATION_FREEZE_180)
fun sampleTestMethod() {
}
}
MockFoldingFeature
Utilisez cette annotation pour la méthode de test ou la classe de test, si vous souhaitez simuler la fonctionnalité de pliage avec les données souhaitées.
Le paramètre
windowBounds
est un tableau de coordonnées qui représente une zone d’affichage destinée à contenir FoldingFeature, par exemple [gauche, haut, droite, bas]. La largeur et la hauteur dewindowBounds
doivent être supérieures à 0. Par défaut, si vous ne définissez pas vos propres valeurs windowBounds, toute la zone d’affichage est utilisée, [0, 0, uiDevice.displayWidth, uiDevice.displayHeight].Le paramètre
center
est le centre du pli complémentaire à l’orientation. Pour un pliHORIZONTAL
, il s’agit de l’axe Y et pour un pliVERTICAL
, il s’agit de l’axe X. La valeur par défaut est -1. Si ce paramètre n’est pas fourni, il est calculé en fonction du paramètrewindowBounds
sous la forme windowBounds.centerY() ou windowBounds.centerX(), en fonction duorientation
spécifié.Le paramètre
size
est la plus petite dimension du pli. La plus grande dimension couvre toujours la totalité de la fenêtre. La valeur par défaut est 0.Le paramètre
state
représente l’état du pli. Les valeurs possibles sontFoldingFeatureState.HALF_OPENED
etFoldingFeatureState.FLAT
. La valeur par défaut estFoldingFeatureState.HALF_OPENED
. Consultez la section Posture dans la documentation officielle pour obtenir des exemples visuels et des références.Le paramètre
orientation
représente l’ orientation du pli. Les valeurs possibles sontFoldingFeatureOrientation.HORIZONTAL
etFoldingFeatureOrientation.VERTICAL
. La valeur par défaut estFoldingFeatureOrientation.HORIZONTAL
.
@RunWith(FoldableJUnit4ClassRunner::class)
@MockFoldingFeature(
size = 2,
state = FoldingFeatureState.FLAT,
orientation = FoldingFeatureOrientation.HORIZONTAL
)
class TestSample {
private val activityScenarioRule = activityScenarioRule<MainActivity>()
private val foldableTestRule = FoldableTestRule()
@get:Rule
val testRule: TestRule = foldableRuleChain(activityScenarioRule, foldableTestRule)
@Test
fun sampleTestMethod() {
}
}
or
@RunWith(FoldableJUnit4ClassRunner::class)
class TestSample {
private val activityScenarioRule = activityScenarioRule<MainActivity>()
private val foldableTestRule = FoldableTestRule()
@get:Rule
val testRule: TestRule = foldableRuleChain(activityScenarioRule, foldableTestRule)
@Test
@MockFoldingFeature(
size = 2,
state = FoldingFeatureState.FLAT,
orientation = FoldingFeatureOrientation.HORIZONTAL
)
fun sampleTestMethod() {
}
}
TargetDevices
Utilisez cette annotation pour la méthode de test ou la classe de test, si vous souhaitez exécuter le test uniquement sur les appareils spécifiés, ou si vous souhaitez ignorer certains appareils.
Le paramètre
devices
est un tableau des appareils souhaités alors que le paramètreignoreDevices
est un tableau des appareils à ignorer.Exemple d’utilisation :
@TargetDevices(devices = [DeviceModel.SurfaceDuo, DeviceModel.SurfaceDuo2]), @TargetDevices(ignoreDevices = [DeviceModel.SurfaceDuo])
Vous ne pouvez pas utiliser les deux paramètres en même temps.
Valeurs possibles pour le modèle d’appareil :
DeviceModel.SurfaceDuo
- représentation pour l’appareil ou l’émulateurSurfaceDuo1
DeviceModel.SurfaceDuo2
- représentation pour l’appareil et l’émulateurSurfaceDuo2
DeviceModel.HorizontalFoldIn
- représentation pour les appareils et les émulateurs6.7" horizontal Fold-In
DeviceModel.FoldInOuterDisplay
- représentation pour7.6" Fold-In
avec des émulateurs et des périphériques d’affichage externesDeviceModel.FoldOut
- représentation pour les appareils et les émulateurs8" FoldOut
DeviceModel.Other
- représentation pour d’autres appareils et émulateurs de type tablette
@RunWith(FoldableJUnit4ClassRunner::class)
@TargetDevices(devices = [DeviceModel.SurfaceDuo])
class TestSample {
private val activityScenarioRule = activityScenarioRule<MainActivity>()
private val foldableTestRule = FoldableTestRule()
@get:Rule
val testRule: TestRule = foldableRuleChain(activityScenarioRule, foldableTestRule)
@Test
fun sampleTestMethod() {
}
}
or
@RunWith(FoldableJUnit4ClassRunner::class)
class TestSample {
private val activityScenarioRule = activityScenarioRule<MainActivity>()
private val foldableTestRule = FoldableTestRule()
@get:Rule
val testRule: TestRule = foldableRuleChain(activityScenarioRule, foldableTestRule)
@Test
@TargetDevices(devices = [DeviceModel.SurfaceDuo])
fun sampleTestMethod() {
}
}
DeviceOrientation
Utilisez cette annotation pour la méthode de test ou la classe de test, si vous souhaitez exécuter le test dans l’orientation d’appareil spécifiée.
- Le paramètre
orientation
représente l’orientation de l’appareil et peut avoir les valeurs suivantes :UiAutomation.ROTATION_FREEZE_0
,UiAutomation.ROTATION_FREEZE_90
,UiAutomation.ROTATION_FREEZE_180
,UiAutomation.ROTATION_FREEZE_270
@RunWith(FoldableJUnit4ClassRunner::class)
@DeviceOrientation(orientation = UiAutomation.ROTATION_FREEZE_180)
class TestSample {
private val activityScenarioRule = activityScenarioRule<MainActivity>()
private val foldableTestRule = FoldableTestRule()
@get:Rule
val testRule: TestRule = foldableRuleChain(activityScenarioRule, foldableTestRule)
@Test
fun sampleTestMethod() {
}
}
or
@RunWith(FoldableJUnit4ClassRunner::class)
class TestSample {
private val activityScenarioRule = activityScenarioRule<MainActivity>()
private val foldableTestRule = FoldableTestRule()
@get:Rule
val testRule: TestRule = foldableRuleChain(activityScenarioRule, foldableTestRule)
@Test
@DeviceOrientation(orientation = UiAutomation.ROTATION_FREEZE_180)
fun sampleTestMethod() {
}
}
FoldableTestRule
FoldableTestRule
est un TestRule
personnalisé qui doit être utilisé avec les annotations @SingleScreenTest
, @DualScreenTest
, @MockFoldingFeature
et @DeviceOrientation
. Les annotations ne fonctionneront pas sans l’utilisation de cette règle de test. Ce TestRule
utilise la réflexion pour récupérer ces annotations et paramètres afin d’exécuter les tests dans la posture et l’orientation d’appareil souhaitées.
FoldableJUnit4ClassRunner
FoldableJUnit4ClassRunner
est un AndroidJUnit4ClassRunner
personnalisé qui doit être utilisé avec les annotations @SingleScreenTest
, @DualScreenTest
, @MockFoldingFeature
, @DeviceOrientation
et @TargetDevices
. Cet exécuteur valide les paramètres des annotations. Il ignore les tests quand l’appareil actuel ne figure pas dans la liste des appareils cibles ou dans la liste des appareils ignorés. Si ce Runner
n’est pas utilisé, les annotations ne sont pas validées, et l’annotation @TargetDevices
n’a aucun effet.
Contraintes relatives aux annotations
@SingleScreenTest
,@DualScreenTest
,@MockFoldingFeature
ne peuvent pas être utilisés ensemble. Par exemple, vous ne pouvez pas avoir la même méthode ou la même classe de test annotée avec les annotations@SingleScreenTest
et@DualScreenTest
.@TargetDevices.devices
et@TargetDevices.ignoreDevices
ne peuvent pas être utilisés conjointement. Par exemple, vous ne pouvez pas avoir la même méthode ou la même classe de test annotée avec@TargetDevices(devices = [DeviceModel.SurfaceDuo, DeviceModel.SurfaceDuo2], ignoreDevices = [DeviceModel.Other])
.Utilisation correcte :
@TargetDevices(devices = [DeviceModel.SurfaceDuo])
ou@TargetDevices(ignoreDevices = [DeviceModel.SurfaceDuo])
@MockFoldingFeature.windowBounds
doit être un tableau de quatre éléments représentant les coordonnées de gauche, du haut, de droite et du bas de la fenêtre d’affichage. Par exemple, vous ne pouvez pas l’utiliser comme ceci :@MockFoldingFeature(windowBounds = [0, 0, 0])
ou@MockFoldingFeature(windowBounds = [0, 0, 0, 0, 0])
.