Exécuter des tests avec plusieurs appareils

Cette page vous aide à utiliser le harnais de test de la Trade Federation 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.

En quoi l'utilisation de plusieurs appareils est-elle différente ?

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 pour un seul appareil est valide pour le mode multi-appareil.

<! -- 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 de plusieurs appareils

Dans ce document, nous partons du principe que vous connaissez déjà la configuration de test TF typique. Voici à quoi ressemble une configuration de test classique 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 points doivent être mentionnés concernant la structure:

  • Pour chaque appareil qui sera nécessaire, une <device> est attendue.
  • <build_provider>, <target_preparer>, <device_recovery>, <device_requirements> et <device_options>, le cas échéant, doivent être inclus dans la balise <device>. Sinon, une exception sera générée.
  • L'attribut name pour <device> est obligatoire et doit être unique parmi tous les appareils présents dans la configuration. Il permet de faire référence à l'appareil spécifique qui lui est associé. Cela permet à votre test de cibler un appareil particulier.
  • <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 balise <device>.

Toutes les autres règles applicables à la configuration d'un seul appareil restent applicables 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 un champ d'application de l'appareil à l'aide de {<device name>}, où <device name> correspond au 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 ?

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

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

L'étape de préparation pour les appareils multi-appareils est presque la même que pour les appareils individuels. Chaque appareil est préparé en appelant <target_preparer> dans l'ordre d'apparition dans <device>.

Vous pouvez également utiliser <multi_target_preparer> spécifié à la racine de la configuration, 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.

Vous pouvez également 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 individuelle des appareils.

Exemple :

appareil flash 1 (target_preparer) appareil flash 2 (target_preparer) Bluetooth connecter les deux appareils (multi_target_preparer)

Écrire un test multi-appareil

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

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

IMultiDeviceTest vous fournit une mise en correspondance directe de l'appareil avec son IBuildInfo, tandis que IInvocationContextReceiver vous fournit ensuite le contexte complet (appareil, IBuildInfo et 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 que votre cas d'utilisation est pertinent, envoyez votre raisonnement à la liste android-platform.

Exemple Hello World pour plusieurs appareils

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

Il s'agit d'un exemple complet qui implique:

  • Allouer deux appareils
  • Accéder aux deux appareils via un multi_target_preparer
  • Exécuter un test qui utilise les deux appareils

Une fois Tradefed compilé, vous pouvez utiliser la commande suivante dans le shell TF:

run example/multi-devices

Le résultat qui s'affiche doit contenir 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'

Pour effectuer l'opération ci-dessus, vous devez connecter deux appareils. Vous pouvez vérifier cela via: adb devices

Lorsque l'appel est en cours, vous pouvez le surveiller comme des appareils individuels 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. Si possible, vous devez donner un nom plus descriptif en fonction du type d'appareil que vous vous attendez à définir.