Écrire un test piloté par l'hôte dans la fédération commerciale

Cette page explique comment écrire un test d'appareil de type JUnit4 géré par l'hôte. Cela signifie que le côté hôte de l'exploit va déclencher des actions contre l'appareil.

Notez que nous considérons que le serveur est "côté hôte". et des tests basés sur l'hôte, les tests soient légèrement différent:

  • test piloté par l'hôte: est un test en cours d'exécution sur l'hôte qui interagit avec un ou plus d'appareils. Le système soumis aux tests (SUT) ne se trouve pas sur l'hôte lui-même, mais il en cours de test à partir de l'hôte.
  • test côté hôte: il s'agit d'un test exécuté exclusivement sur l'hôte et qui teste quelque chose uniquement sur l'hôte (tests unitaires, par exemple).

Pourquoi créer un test basé sur l'hôte plutôt qu'un test d'instrumentation ?

Certains tests peuvent vous obliger à modifier l'état général de l'appareil, comme l'émission d'une redémarrer la commande. Dans le cas de test d'instrumentation, un redémarrage arrête une instrumentation, le test n'a pas pu se poursuivre et aucun résultat ne serait disponible.

Les tests pilotés par l'hôte peuvent également entraîner des étapes de configuration supplémentaires qui nécessitent une interaction avec des périphériques externes dont dépend le test.

Un test piloté par l'hôte peut gérer ces cas d'utilisation et permettre des tests avancés de l’appareil avec plus de scénarios. Dans ce cas, rédiger une le test basé sur l'hôte est le plus logique.

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());
    }
}

Dans la fédération commerciale, les tests pilotés par l'hôte sont pilotés par l'exécuteur DeviceJUnit4ClassRunner. Exécuteur de test JUnit4. La structure globale de la classe de test est identique à celle d'un test JUnit4 standard:

  • @BeforeClass
  • @Before
  • @Test
  • @After
  • @AfterClass
  • Assume, Assert

Étendre BaseHostJunit4Test permet d'hériter d'API 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 la cible. appareil.
  • uninstallPackage: permet de désinstaller un APK.
  • isPackageInstalled: vérifie si un package est installé ou non.
  • hasDeviceFeature: vérifie si l'appareil prend en charge une fonctionnalité ou non. (pm list features)
  • runDeviceTests(DeviceTestRunOptions options): exécuter une instrumentation effectuer un test par rapport à 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 TF device pour manipuler l'appareil.
  • getBuild(): renvoie un objet TF d'informations sur la compilation pour obtenir des informations sur le créer.
  • getAbi(): renvoie l'ABI avec laquelle le test est exécuté.

Assistance Tradefed: préparation et nettoyage des appareils par classe

Les fonctions @BeforeClass et @AfterClass de JUnit4 ne s'appliquent qu'aux méthodes statiques. ce qui rend impossible d'utiliser le gestionnaire #getDevice() pour effectuer certaines une configuration ou un nettoyage unique pour chaque 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 les propriétés qui peuvent être utilisé dans le champ d'application statique ou non statique. Compatibilité avec BaseHostJUnit4Test 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 le Test hôte "exécuteur".

<test class="com.android.tradefed.testtype.HostTest" >
    <option name="class" value="android.sample.cts.SampleHostJUnit4DeviceTest" />
</test>