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

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'harnais 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 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: 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 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 repose.

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, il est préférable d'écrire un test piloté par l'hôte.

Comment les tests hôtes 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 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

É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 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 prend en charge 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 TF device pour manipuler l'appareil.
  • getBuild() : renvoie un objet TF d'informations de compilation pour obtenir des informations sur la compilation.
  • getAbi(): renvoie l'ABI avec laquelle le test est exécuté.

Compatibilité avec Tradefed : préparation et nettoyage des appareils par classe

@BeforeClass et @AfterClass de JUnit4 ne s'appliquent qu'aux méthodes statiques, ce qui rend impossible l'utilisation du gestionnaire #getDevice() pour effectuer une configuration ou un nettoyage ponctuel, par classe, 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 pouvant être utilisées 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>