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