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.