Cette page explique comment écrire un test d'appareil de style JUnit4 piloté par l'hôte. Cela signifie que le côté hôte du faisceau va déclencher des actions sur l'appareil.
Notez que nous considérons que les tests côté hôte et les tests gérés par l'hôte sont légèrement différents:
- test piloté par l'hôte: test exécuté sur l'hôte qui interagit avec un ou plusieurs appareils. Le système sous test (SUT) ne se trouve pas sur l'hôte lui-même, mais est testé à partir de l'hôte.
- test côté hôte: test exécuté exclusivement sur l'hôte et test d'un élément uniquement sur l'hôte, par exemple des tests unitaires.
Pourquoi créer un test piloté par l'hôte plutôt qu'un test d'instrumentation ?
Certains tests peuvent nécessiter d'affecter l'état global de l'appareil, comme en émettant une commande de redémarrage. Dans le scénario de test d'instrumentation, un redémarrage arrête l'instrumentation, le test ne peut pas se poursuivre et aucun résultat n'est disponible.
Les tests hôtes peuvent également générer des étapes de configuration supplémentaires qui nécessitent une interaction avec les appareils externes sur lesquels le test dépend.
Un test piloté par l'hôte peut gérer ces cas d'utilisation et permettre de tester l'appareil de manière avancée avec davantage de scénarios. Dans ce cas, il est préférable d'écrire un test piloté par l'hôte.
Comment les tests pilotés par l'hôte sont-ils écrits dans TensorFlow ?
Voici un exemple:
@RunWith(DeviceJUnit4ClassRunner.class)
public class SampleHostJUnit4DeviceTest extends BaseHostJUnit4Test {
@Before
public void setUp() throws Exception {
// Some setup
}
@Test
public void testCheckWeHaveDevice() throws Exception {
Assert.assertNotNull(getDevice());
}
}
Les tests hôtes dans Trade Federation sont gérés par l'exécuteur de test JUnit4 DeviceJUnit4ClassRunner. La structure globale de la classe de test est identique à celle d'un test JUnit4 standard:
@BeforeClass
@Before
@Test
@After
@AfterClass
Assume
,Assert
L'extension de BaseHostJunit4Test permet d'hériter d'API d'utilitaires de test utiles, telles que:
installPackage
: permet d'installer un APK sur l'appareil cible.installPackageAsUser
: permet d'installer un APK en tant qu'utilisateur sur l'appareil cible.uninstallPackage
: permet de désinstaller un APK.isPackageInstalled
: vérifie si un package est installé ou non.hasDeviceFeature
: vérifie si l'appareil est compatible avec une fonctionnalité ou non. (pm list features
)runDeviceTests(DeviceTestRunOptions options)
: exécutez un test d'instrumentation sur un appareil cible à l'aide de DeviceTestRunOptions pour gérer toutes les options possibles.
Fournit également un accès à l'objet d'appareil Tradefed:
getDevice()
: renvoie un objet d'appareil TF pour le manipuler.getBuild()
: renvoie un objet TF d'informations de compilation pour obtenir des informations sur la compilation.getAbi()
: renvoie l'ABI sur lequel le test s'exécute.
Compatibilité avec Tradefed: préparation et nettoyage des appareils par classe
Les @BeforeClass
et @AfterClass
JUnit4 ne s'appliquent qu'aux méthodes statiques. Il est donc impossible d'utiliser le gestionnaire #getDevice()
pour effectuer une configuration ou un nettoyage spécifique à l'appareil, unique et par classe. Pour résoudre ce problème, utilisez l'annotation Tradefed.
- @BeforeClassWithInfo: s'exécute avant les annotations @BeforeClass
- @AfterClassWithInfo: s'exécute après les annotations @AfterClass
@BeforeClassWithInfo
public static void beforeClassWithDevice(TestInformation testInfo) {
assertNotNull(testInfo.getDevice());
testInfo.properties().put("mytest:test-prop", "test");
}
@AfterClassWithInfo
public static void afterClassWithDevice(TestInformation testInfo) {
assertNotNull(testInfo.getDevice());
testInfo.properties().put("mytest:test-prop", "test");
}
TestInformation
vous permet d'utiliser l'appareil et de stocker des propriétés pouvant être utilisées dans le champ d'application statique ou non statique. BaseHostJUnit4Test
permet d'obtenir le TestInformation
dans un champ d'application non statique via #getTestInformation()
.
Si vous n'étendez pas BaseHostJUnit4Test
, vous pouvez implémenter ITestInformationReceiver
pour recevoir l'objet TestInformation
.
Comment configurer un test piloté par l'hôte dans Tradefed ?
Dans le fichier de configuration XML Tradefed, les tests pilotés par l'hôte sont exécutés via l'exécuteur HostTest.
<test class="com.android.tradefed.testtype.HostTest" >
<option name="class" value="android.sample.cts.SampleHostJUnit4DeviceTest" />
</test>