Écrire un test piloté par l'hôte dans Trade Federation

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 harnais va déclencher des actions sur l'appareil.

Notez que nous considérons que les tests "côté hôte" et les tests "pilotés par l'hôte" sont légèrement différents :

  • test piloté par l'hôte : test exécuté sur l'hôte et interagissant avec un ou plusieurs appareils. Le système 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é uniquement sur l'hôte et qui teste quelque chose uniquement sur l'hôte, par exemple les tests unitaires.

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

Certains tests peuvent vous obliger à modifier l'état général de l'appareil, par exemple en émettant une commande de redémarrage. Dans le scénario de test d'instrumentation, un redémarrage interromprait l'instrumentation, le test ne pourrait pas 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 appareils 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 davantage de scénarios. Dans ce cas, il est plus judicieux d'écrire un test piloté par l'hôte.

Comment les tests pilotés par l'hôte sont-ils écrits dans TF ?

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 pilotés par l'hôte dans Trade Federation sont pilotés par l'exécuteur de test JUnit4 DeviceJUnit4ClassRunner. La structure globale de la classe de test est la même que celle d'un test JUnit4 standard :

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

L'extension de BaseHostJunit4Test permet d'hériter d'une API d'utilitaires de test utiles, comme :

  • 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é. (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.

Fournissez également l'accès à l'objet d'appareil Tradefed :

  • getDevice() : renvoie un objet d'appareil TF pour manipuler l'appareil.
  • getBuild() : renvoie un objet TF d'informations sur la compilation pour obtenir des informations sur la compilation.
  • getAbi() : renvoie l'ABI sur laquelle le test est exécuté.

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

Les annotations JUnit4 @BeforeClass et @AfterClass ne s'appliquent qu'aux méthodes statiques, ce qui rend impossible l'utilisation du gestionnaire #getDevice() pour effectuer une configuration ou un nettoyage unique par classe et spécifique à l'appareil. 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 qui peuvent être utilisées dans le champ statique ou non statique. BaseHostJUnit4Test permet d'obtenir TestInformation dans un champ 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 runner HostTest.

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