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

Cette page décrit comment écrire un test de périphérique de style JUnit4 piloté par l'hôte. Cela signifie que le côté hôte du harnais va déclencher des actions contre 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 : il s'agit d'un test exécuté sur l'hôte qui interagit 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 : il s'agit d'un test exécuté uniquement sur l'hôte et testant quelque chose 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 que vous affectiez l'état général du périphérique, comme l'émission d'une commande de redémarrage. Dans le scénario de test de l'instrumentation, un redémarrage tuerait l'instrumentation, le test ne pourrait pas continuer 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 davantage de scénarios. Si vous êtes dans cette situation, écrire un test piloté par l’hôte est la solution la plus logique.

Comment les tests pilotés par l’hôte sont-ils écrits en 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 le programme d'exécution de tests DeviceJUnit4ClassRunner JUnit4. La structure globale de la classe de test est la même que celle d'un test JUnit4 classique :

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

L'extension de BaseHostJunit4Test est un moyen d'hériter de l'API d'utilitaires de test utiles tels 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érifiez si un package est installé ou non.
  • hasDeviceFeature : Vérifiez si l'appareil prend en charge une fonctionnalité ou non. ( pm list features )
  • runDeviceTests(DeviceTestRunOptions options) : exécutez un test d'instrumentation sur un périphérique cible à l'aide de DeviceTestRunOptions pour gérer toutes les options possibles.

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

  • getDevice() : renvoie un objet périphérique TF pour manipuler le périphérique.
  • getBuild() : renvoie un objet TF d'informations de build pour obtenir des informations sur la build.
  • getAbi() : renvoie l'ABI sur lequel le test est exécuté.

Prise en charge de Tradefed : préparation et nettoyage des appareils par classe

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 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 les propriétés du périphérique et du magasin qui peuvent être utilisées dans la portée statique ou non statique. BaseHostJUnit4Test prend en charge l'obtention des TestInformation dans une portée non statique via #getTestInformation() .

Si vous n'étendez pas BaseHostJUnit4Test , vous pouvez implémenter ITestInformationReceiver afin de 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 programme d'exécution HostTest .

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