Ejecutar pruebas con varios dispositivos

Esta página te ayuda a usar el kit 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é diferencia hay con varios dispositivos?

Hay varios aspectos diferentes cuando se configuran y ejecutan pruebas para varios dispositivos en Trade Federation, en particular:

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

<! -- TODO: Aclara la oración inmediatamente anterior agregando un ejemplo de un caso de uso de un dispositivo, ya que pertenece al modo multidispositivo en una segunda oración. >>

Configuración de varios dispositivos

En este documento, se supone que ya conoces la configuración típica de la prueba de TF. Esta es la apariencia 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>

Hay varios aspectos que se deben mencionar sobre la estructura:

  • Para cada dispositivo que se necesitará, se espera un <device>.
  • Si es necesario, se deben incluir <build_provider>, <target_preparer>, <device_recovery>, <device_requirements> y <device_options> en 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 a él. Esto permite que la prueba se segmente para un dispositivo en particular.
  • <option> puede tener un alcance global cuando está 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 el device_requirements (por lo general, la variante del dispositivo, el producto, etcétera) en 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 varios dispositivos es casi el mismo que para un solo dispositivo. Cada dispositivo se prepara llamando a <target_preparer> en orden de aparición 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.

  • Se debe usar <pre_multi_target_preparer> para configuraciones que deben realizarse antes de la configuración individual de un dispositivo.
  • Se debe usar <multi_target_preparer> para la configuración que se debe realizar después de la configuración de dispositivos individuales.

Por ejemplo:

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

Cómo escribir una prueba multidispositivo

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

Para que las pruebas reciban los dispositivos en prueba, puedes implementar IMultiDeviceTest o IInvocationContextReceiver.

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

Luego, podrás usar las APIs normales de ITestDevice que TF pone a disposición para la escritura de 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 que se debe admitir, envía tu razonamiento a la lista 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 implica lo siguiente:

  • Asignación de dos dispositivos
  • Accede 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 la shell de TF:

run example/multi-devices

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

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

Cuando la invocación esté en curso, puedes supervisarla 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ías poder ver los dispositivos involucrados en cada invocación, así como todos los dispositivos disponibles y su estado respectivo.

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