Exécuter des tests avec plusieurs appareils

Cette page vous aide à utiliser le 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 lorsque vous configurez et exécutez des tests multi-appareils dans Trade Federation, en particulier :

Toute configuration à un seul appareil existante 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 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 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 points concernant la structure doivent être mentionnés :

  • Un <device> est attendu pour chaque appareil nécessaire.
  • <build_provider>, <target_preparer>, <device_recovery>, <device_requirements> et <device_options>, le cas échéant, doivent être inclus dans la balise <device>. Dans le cas contraire, 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 est utilisé pour faire référence à l'appareil spécifique auquel il 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 balise <device>.

Toutes les autres règles applicables à la configuration à un seul appareil s'appliquent également 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, il est également possible de 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 pouvez cibler 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 à device_requirements (généralement la variante, le produit, etc. de l'appareil) dans l'ordre d'apparition de l'appareil dans la configuration. Chaque fois qu'un appareil est attribué, TF tente d'attribuer le suivant. S'il n'est pas possible d'allouer tous les appareils, ils seront tous libérés et la commande sera réessayée lorsque tous les appareils seront associés.

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

L'étape de préparation pour plusieurs appareils est presque identique à celle pour un seul appareil. 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, ce qui permet d'effectuer des étapes de préparation nécessitant plusieurs appareils, comme l'association d'appareils. Elle 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 chaque appareil.
  • <multi_target_preparer> doit être utilisé pour la configuration qui doit être effectuée après la configuration de chaque appareil.

Exemple :

flasher l'appareil 1 (target_preparer) flasher l'appareil 2 (target_preparer) bluetooth connecter les deux appareils (multi_target_preparer)

Écrire un test multi-appareils

Lorsque vous écrivez un test standard à 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 donne une carte directe de l'appareil à son IBuildInfo, tandis que IInvocationContextReceiver vous donne ensuite le contexte complet (appareil, IBuildInfo et métadonnées).

Vous pourrez ensuite utiliser les API ITestDevice habituelles que TF met à disposition pour la rédaction de tests.

Il n'existe pas encore d'API permettant d'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'implémentation multi_target_preparer HelloWorldMultiTargetPreparer qui montre comment recevoir la liste des appareils et de leurs versions.

Voici un exemple complet qui implique :

  • Attribuer 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 l'interface TF :

run example/multi-devices

Vous devriez obtenir un résultat 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'

Pour exécuter les commandes ci-dessus, vous devez avoir deux appareils connectés. Pour vérifier cela, vous pouvez : adb devices

Lorsque l'invocation est en cours, vous pouvez la 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 de la configuration device1 et device2. Si possible, vous devez leur donner un nom plus descriptif en fonction du type d'appareil que vous vous attendez réellement à définir.