Ejecutar pruebas con múltiples dispositivos

Esta página le ayuda a utilizar el arnés de prueba de Trade Federation con varios dispositivos durante las pruebas. Primero debe familiarizarse con el uso normal, como se describe en el ejemplo de un extremo a otro .

¿Qué es diferente con múltiples dispositivos?

Varias cosas son diferentes al configurar y ejecutar pruebas multidispositivo en Trade Federation, en particular:

Cualquier configuración de un dispositivo existente es válida para el modo multidispositivo.

<! -- TODO: Aclare la oración inmediatamente anterior agregando un ejemplo de un caso de uso de un solo dispositivo en lo que respecta al modo multidispositivo en una segunda oración. -->>

Configuración de múltiples dispositivos

Este documento asume que usted ya está familiarizado con la configuración típica de prueba TF. Así es como se ve una configuración de prueba típica con dos dispositivos:

<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>

Hay que mencionar varias cosas sobre la estructura:

  • Para cada dispositivo que será necesario, se espera un <device> .
  • <build_provider> , <target_preparer> , <device_recovery> , <device_requirements> y <device_options> si es necesario deben incluirse dentro de la etiqueta <device> ; De lo contrario, se lanzará una excepción.
  • el atributo name para <device> es obligatorio y debe ser único entre todos los dispositivos presentes en la configuración. Se utiliza para hacer referencia al dispositivo particular asociado con él. Esto permite que su prueba se dirija a un dispositivo en particular.
  • <option> puede tener un alcance global cuando está en la raíz de la configuración o estar limitado al alcance del dispositivo cuando se especifica dentro de la etiqueta <device> .

Todas las demás reglas aplicables a la configuración de un solo dispositivo siguen siendo aplicables aquí. Consulte el ejemplo de Hola mundo a continuación para obtener más detalles.

Actualización de línea de comando

Al especificar opciones en la línea de comando TF, también es posible especificar un alcance de dispositivo usando {<device name>} donde <device name> es el nombre especificado en la configuración XML.

En el ejemplo anterior, se permitieron las siguientes opciones:

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

Puedes apuntar solo a uno de los objetos build_provider del dispositivo usando el nombre del dispositivo, así:

--{device2}device-setup:disable

En este ejemplo, device2 omite la configuración del dispositivo, mientras que device1 no.

¿Cómo selecciona TF los dispositivos?

Trade Federation busca un dispositivo que coincida con los device_requirements (normalmente el tipo de dispositivo, el producto, etc.) en el orden de aparición del dispositivo en la configuración. Cada vez que se asigna un dispositivo, TF intenta asignar el siguiente. Si no es posible asignar todos los dispositivos, se liberarán todos y se volverá a intentar el comando cuando todos los dispositivos coincidan.

¿Cómo prepara TF los dispositivos?

El paso de preparación para dispositivos múltiples es prácticamente el mismo que para dispositivos individuales. Cada dispositivo se prepara llamando a <target_preparer> en orden de aparición dentro del <device> .

También puede usar <multi_target_preparer> especificado en la raíz de la configuración que permite pasos de preparación que requieren múltiples dispositivos, como el emparejamiento de dispositivos. Se ejecuta después del paso target_preparer .

Una alternativa es <pre_multi_target_preparer> que se ejecuta antes del paso target_preparer .

  • <pre_multi_target_preparer> debe usarse para la configuración que debe realizarse antes de la configuración del dispositivo individual.
  • <multi_target_preparer> debe usarse para la configuración que debe realizarse después de la configuración de dispositivos individuales.

Por ejemplo:

dispositivo flash 1 (target_preparer) dispositivo flash 2 (target_preparer) bluetooth conecta ambos dispositivos (multi_target_preparer)

Escribe una prueba multidispositivo

Al escribir una prueba normal de un solo dispositivo, implementa la interfaz IDeviceTest .

Para que las pruebas reciban los dispositivos bajo prueba, puede implementar IMultiDeviceTest o IInvocationContextReceiver .

IMultiDeviceTest le brinda un mapa directo del dispositivo a su IBuildInfo , mientras que IInvocationContextReceiver luego le brinda el contexto completo (dispositivo, IBuildInfo y metadatos).

Luego podrá utilizar las API habituales de ITestDevice que TF puso a disposición para la redacción de pruebas.

Aún no existen API para realizar operaciones de un dispositivo a otro, como device1.sync(device2) . Si cree que tiene un caso de uso convincente que debe admitirse, envíe su razonamiento a la lista de plataformas de Android .

Ejemplo de hola mundo con múltiples dispositivos

Agregamos una configuración de ejemplo similar a Hello World: multi-devices.xml. También hay un ejemplo de implementación de multi_target_preparer HelloWorldMultiTargetPreparer que muestra cómo recibir la lista de dispositivos y sus compilaciones.

Este es un ejemplo completo que involucra:

  • Asignar dos dispositivos
  • Accediendo a ambos dispositivos a través de un multi_target_preparer
  • Ejecutando una prueba que utiliza los dos dispositivos

Una vez que haya creado Tradefed, puede usar el siguiente comando en TF Shell:

run example/multi-devices

Debería ver algún resultado que contenga lo siguiente:

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'

Necesita dos dispositivos conectados para ejecutar lo anterior. Esto se puede verificar a través de: adb devices

Cuando la invocación está en curso, puede monitorearla como dispositivos individuales con list i y 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

Debería poder ver los dispositivos involucrados en cada invocación, así como todos los dispositivos disponibles y su estado respectivo.

Tenga en cuenta que en este ejemplo llamamos a los dos dispositivos en la configuración device1 y device2 ; Si es posible, deberías darle un nombre más descriptivo dependiendo del tipo de dispositivo que realmente esperas que se configure.