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 multidispositivo en Trade Federation, en particular:
Cualquier configuración existente de un solo dispositivo es válida para el modo multidispositivo.
<! -- TODO: Para aclarar la oración anterior, agrega un ejemplo de un caso de uso de un dispositivo en relación con el modo multidispositivo en una segunda oración. -->>
Configuración de varios dispositivos
En este documento, se supone que ya conoces la configuración de prueba típica 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,
<build_provider>
,<target_preparer>
,<device_recovery>
,<device_requirements>
y<device_options>
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 particular asociado con é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 coincidan 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.
Para preparar cada dispositivo, se llama a <target_preparer>
en orden de apariencia 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 la configuración que debe realizarse antes de la configuración de dispositivos individuales. - 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:
escribe en la memoria flash del dispositivo 1 (target_preparer) escribe en la memoria flash del dispositivo 2 (target_preparer) conecta ambos dispositivos por Bluetooth (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 incluye lo siguiente:
- Cómo asignar 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 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.