Exécuter des tests avec plusieurs appareils

Cette page vous explique comment utiliser Trade Federation Test Harness avec plusieurs appareils lors des tests.Vous devez d'abord vous familiariser avec l'utilisation normale, comme décrit dans l'exemple de bout en bout.

Quelles sont les différences avec plusieurs appareils ?

Plusieurs éléments sont différents lors de la configuration et de l'exécution de tests multi-appareils dans Trade Federation, en particulier :

Toute configuration existante à un seul appareil est valide pour le mode multi-appareils.

<! -- TODO: Clarify the sentence immediately above by adding an example of a one-device use case as it pertains to multi-device mode in a second sentence. -->>

Configuration multi-appareils

Ce document suppose que vous connaissez déjà la configuration de test TF typique. Voici à quoi ressemble une configuration de test typique avec deux appareils :

<configuration description="A simple multi-devices example in Tradefed">

    <device name="device1">
        <target_preparer class="com.android.tradefed.targetprep.DeviceSetup" />
    </device>

    <device name="device2">
        <target_preparer class="com.android.tradefed.targetprep.DeviceSetup" />
    </device>

    <option name="log-level" value="verbose" />
    <test class="com.android.tradefed.HelloWorldMultiDevices" />

    <logger class="com.android.tradefed.log.FileLogger" />
    <result_reporter class="com.android.tradefed.result.ConsoleResultReporter" />

</configuration>

Plusieurs éléments doivent être mentionnés concernant la structure :

  • Pour chaque appareil nécessaire, un <device> est attendu.
  • <build_provider>, <target_preparer>, <device_recovery>, <device_requirements>, et <device_options> doivent être inclus dans la balise <device> si nécessaire. Dans le cas contraire, une exception sera générée.
  • L'attribut name de <device> est obligatoire et doit être unique parmi tous les appareils présents dans la configuration. Il est utilisé pour référencer l'appareil particulier qui lui est associé. Cela permet à votre test de cibler un appareil spécifique.
  • <option> peut avoir une portée globale lorsqu'il se trouve à la racine de la configuration ou être limité à la portée de l'appareil lorsqu'il est spécifié dans la <device> balise.

Toutes les autres règles applicables à la configuration à un seul appareil s'appliquent toujours ici. Pour en savoir plus, consultez l'exemple Hello World ci-dessous.

Mise à jour de la ligne de commande

Lorsque vous spécifiez des options sur la ligne de commande TF, vous pouvez également spécifier une portée d'appareil à l'aide de {<device name>}, où <device name> est le nom spécifié dans la configuration XML.

Dans l'exemple ci-dessus, les options suivantes étaient autorisées :

  • --com.android.tradefed.targetprep.DeviceSetup:disable
  • --device-setup:disable

Vous ne pouvez cibler qu'un seul des objets build_provider de l'appareil à l'aide du nom de l'appareil, comme suit :

--{device2}device-setup:disable

Dans cet exemple, device2 ignore la configuration de l'appareil, contrairement à device1.

Comment TF sélectionne-t-il les appareils ?

Trade Federation recherche un appareil correspondant aux device_requirements (généralement la version de l'appareil, le produit, etc.) dans l'ordre d'apparition des appareils dans la configuration. Chaque fois qu'un appareil est alloué, TF tente d'allouer le suivant. S'il n'est pas possible d'allouer tous les appareils, ils seront tous libérés et la commande sera retentée lorsque tous les appareils seront mis en correspondance.

Comment TF prépare-t-il les appareils ?

L'étape de préparation pour plusieurs appareils est presque la même que pour un seul appareil. Chaque appareil est préparé en appelant le <target_preparer> dans l'ordre d' apparition dans le <device>.

Vous pouvez également utiliser <multi_target_preparer> spécifié à la racine de la configuration, ce qui permet d'effectuer des étapes de préparation nécessitant plusieurs appareils, comme l'association d'appareils. Il s'exécute après l'étape target_preparer.

Une autre solution consiste à utiliser <pre_multi_target_preparer>, qui s'exécute avant l'étape target_preparer.

  • <pre_multi_target_preparer> doit être utilisé pour la configuration qui doit être effectuée avant la configuration de l'appareil individuel.
  • <multi_target_preparer> doit être utilisé pour la configuration qui doit être effectuée après la configuration de l'appareil individuel.

Exemple :

flash device 1 (target_preparer) flash device 2 (target_preparer) bluetooth connect both devices (multi_target_preparer)

Écrire un test multi-appareils

Lorsque vous écrivez un test à un seul appareil, vous implémentez l' interface IDeviceTest.

Pour que les tests reçoivent les appareils testés, vous pouvez implémenter soit IMultiDeviceTest soit IInvocationContextReceiver.

IMultiDeviceTest vous donne une carte directe de l'appareil à son IBuildInfo tandis que IInvocationContextReceiver vous donne ensuite le contexte complet (appareil, IBuildInfo & métadonnées).

Vous pourrez ensuite utiliser les API ITestDevice habituelles que TF met à disposition pour l'écriture de tests.

Aucune API n'existe encore pour effectuer des opérations d'un appareil à un autre, comme device1.sync(device2). Si vous pensez avoir un cas d'utilisation convaincant à prendre en charge, envoyez votre raisonnement à la liste android-platform.

Exemple Hello World multi-appareils

Nous avons ajouté un exemple de configuration de type Hello World : multi-devices.xml Il existe également un exemple d'multi_target_preparer implémentation HelloWorldMultiTargetPreparer qui montre comment recevoir la liste des appareils et leurs builds.

Voici un exemple complet qui implique les éléments suivants :

  • Allocation de deux appareils
  • Accès aux deux appareils via un multi_target_preparer
  • Exécution d'un test qui utilise les deux appareils

Une fois Tradefed créé, vous pouvez utiliser la commande suivante dans l'interface système TF :

run example/multi-devices

Vous devriez voir une sortie contenant les éléments suivants :

08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device '00b4e73b4cbcd162' with build id '3146108'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device 'LP5A390056' with build id '3146108'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device '00b4e73b4cbcd162' from context with build 'com.android.tradefed.build.DeviceBuildInfo@c99cbc1'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device 'LP5A390056' from context with build 'com.android.tradefed.build.DeviceBuildInfo@b41f20c5'

Vous devez connecter deux appareils pour exécuter la commande ci-dessus. Vous pouvez le vérifier à l'aide de la commande adb devices.

Lorsque l'appel est en cours, vous pouvez le surveiller comme des appareils uniques avec list i et list d :

tf >list i
Command Id  Exec Time  Device                          State
1           0m:35      [00b4e73b4cbcd162, LP5A390056]  fetching build
tf >list d
Serial            State      Product   Variant   Build   Battery
00b4e73b4cbcd162  Allocated  bullhead  bullhead  NRD90O  100
LP5A390056        Allocated  shamu     shamu     NRD90I  100

Vous devriez pouvoir voir les appareils impliqués dans chaque appel, ainsi que tous les appareils disponibles et leur état respectif.

Notez que dans cet exemple, nous avons appelé les deux appareils dans la configuration device1 et device2. Vous devez donner un nom plus descriptif si possible, en fonction du type d'appareil que vous prévoyez réellement de configurer.