Rédiger 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 : test exécuté sur l'hôte qui interagit avec un ou plusieurs appareils. Le système sous test (SUT) n'est pas sur l'hôte lui-même mais est testé à partir de l'hôte.
  • test côté hôte : un test s'exécute uniquement sur l'hôte et teste 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 de l'appareil, comme l'émission d'une commande de redémarrage. Dans le cas de test d'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 plus de scénarios. Si vous êtes dans cette situation, écrire un test piloté par l'hôte est le 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 l'exécuteur de test DeviceJUnit4ClassRunner JUnit4. La structure globale de la classe de test est la même que celle d'un test JUnit4 normal :

  • @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érifie si un paquet 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 d'appareil Tradefed :

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

Assistance 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 l'appareil et de stocker les propriétés qui peuvent être utilisées dans la portée statique ou non statique. BaseHostJUnit4Test prend en charge l'obtention de TestInformation dans une étendue 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 Tradefed XML, 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>