Cómo ejecutar pruebas con varios dispositivos

En esta página, se explica cómo usar el agente de prueba de Trade Federation con varios dispositivos durante las pruebas.Primero, debes familiarizarte con el uso normal, como se describe en el ejemplo de extremo a extremo.

¿Qué cambia con varios dispositivos?

Hay varias diferencias cuando se configuran y ejecutan pruebas en varios dispositivos en Trade Federation, en particular:

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

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

Configuración de varios dispositivos

En este documento, se supone que ya conoces la configuración típica de las pruebas de TF. A continuación, se muestra el aspecto de 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>

Se deben mencionar varios aspectos sobre la estructura:

  • Se espera un <device> para cada dispositivo que se necesite.
  • <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 arrojará una excepción.
  • El atributo name para <device> es obligatorio y debe ser único entre todos los dispositivos presentes en la configuración. Se usa para hacer referencia al dispositivo específico asociado. Esto permite que la prueba se dirija a un dispositivo en particular.
  • <option> puede tener un alcance global cuando se encuentra en la raíz de la configuración o limitarse 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 también se aplican aquí. Consulta el ejemplo de Hello World a continuación para obtener más detalles.

Actualización de la línea de comandos

Cuando se especifican opciones en la línea de comandos de TF, también es posible especificar un alcance del dispositivo con {<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 segmentar solo uno de los objetos build_provider del dispositivo con el nombre del dispositivo, de la siguiente manera:

--{device2}device-setup:disable

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

¿Cómo selecciona TF los dispositivos?

Trade Federation busca un dispositivo que coincida con device_requirements (por lo general, la variante, el producto, etcétera) en el orden en que aparecen los dispositivos 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 se encuentren todos los dispositivos.

¿Cómo prepara TF los dispositivos?

El paso de preparación para varios dispositivos es casi el mismo que para un solo dispositivo. Cada dispositivo se prepara llamando a <target_preparer> en el orden en que aparece dentro de <device>.

También puedes usar <multi_target_preparer> especificado en la raíz de la configuración que habilita los pasos de preparación que requieren varios dispositivos, como la vinculación 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> se debe usar para la configuración que debe realizarse antes de la configuración de dispositivos individuales.
  • <multi_target_preparer> se debe usar para la configuración que se debe realizar después de la configuración de cada dispositivo.

Por ejemplo:

Escribir en la memoria flash del dispositivo 1 (target_preparer) Escribir en la memoria flash del dispositivo 2 (target_preparer) Bluetooth Conectar ambos dispositivos (multi_target_preparer)

Escribe una prueba multidispositivo

Cuando escribes una prueba normal para un solo dispositivo, implementas la interfaz IDeviceTest.

Para que las pruebas reciban los dispositivos que se probarán, puedes implementar IMultiDeviceTest o IInvocationContextReceiver.

IMultiDeviceTest te proporciona un mapa directo del dispositivo a su IBuildInfo, mientras que IInvocationContextReceiver más adelante te proporciona el contexto completo (dispositivo, IBuildInfo y metadatos).

Luego, podrás usar las APIs de ITestDevice habituales que TF pone a disposición para escribir pruebas.

Aún no existen APIs para realizar operaciones de un dispositivo a otro, como device1.sync(device2). Si crees que tienes un caso de uso convincente para que se admita, envía tu razonamiento a la lista de android-platform.

Ejemplo de Hello World para varios 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 incluye lo siguiente:

  • Asigna dos dispositivos
  • Acceder a ambos dispositivos a través de un multi_target_preparer
  • Cómo ejecutar una prueba que usa los dos dispositivos

Una vez que hayas compilado Tradefed, puedes usar el siguiente comando en el shell de TF:

run example/multi-devices

Deberías ver un 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'

Para ejecutar lo anterior, necesitas dos dispositivos conectados. Puedes verificarlo con el siguiente comando: adb devices

Cuando la invocación está en curso, puedes supervisarla como si fueran 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ías poder ver los dispositivos involucrados en cada invocación, así como todos los dispositivos disponibles y sus respectivos estados.

Ten en cuenta que, en este ejemplo, llamamos a los dos dispositivos en la configuración device1 y device2. Si es posible, debes asignar un nombre más descriptivo según el tipo de dispositivo que esperas que se configure.