Esegui test con più dispositivi

Questa pagina ti aiuta a utilizzare il Test Harness di Trade Federation con più dispositivi durante i test.Per prima cosa, familiarizza con l'utilizzo normale come descritto nell'esempio end-to-end.

Quali sono le differenze con più dispositivi?

Esistono diverse differenze nella configurazione e nell'esecuzione di test multi-dispositivo in Trade Federation, in particolare:

Qualsiasi configurazione esistente per un solo dispositivo è valida per la modalità multi-dispositivo.

<! -- TODO: chiarisci la frase immediatamente sopra aggiungendo un esempio di caso d'uso con un solo dispositivo in relazione alla modalità multi-dispositivo in una seconda frase. -->>

Configurazione di più dispositivi

Questo documento presuppone che tu abbia già familiarità con la tipica configurazione dei test TF. Ecco l'aspetto di una tipica configurazione di test con due dispositivi:

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

È necessario menzionare alcuni aspetti sulla struttura:

  • Per ogni dispositivo necessario, è previsto un <device>.
  • Se necessario, <build_provider>, <target_preparer>, <device_recovery>, <device_requirements> e <device_options> devono essere inclusi nel tag <device>; in caso contrario, verrà generata un'eccezione.
  • L'attributo name per <device> è obbligatorio e deve essere univoco tra tutti i dispositivi presenti nella configurazione. È utilizzato per fare riferimento al particolare dispositivo associato. Ciò consente al test di scegliere come target un particolare dispositivo.
  • <option> può avere un ambito globale se si trova nella radice della configurazione o essere limitato all'ambito del dispositivo se specificato all'interno del tag <device>.

Tutte le altre regole applicabili alla configurazione su un singolo dispositivo rimangono valide qui. Per maggiori dettagli, vedi l'esempio Hello World di seguito.

Aggiornamento della riga di comando

Quando specifichi le opzioni nella riga di comando di TF, è anche possibile specificare un ambito del dispositivo utilizzando {<device name>}, dove <device name> è il nome specificato nella configurazione XML.

Nell'esempio precedente, sono state consentite le seguenti opzioni:

  • --com.android.tradefed.targetprep.DeviceSetup:disable
  • --device-setup:disable

Puoi scegliere come target solo uno degli oggetti build_provider del dispositivo utilizzando il nome del dispositivo, come segue:

--{device2}device-setup:disable

In questo esempio, device2 salta la configurazione del dispositivo, mentre device1 no.

In che modo TF seleziona i dispositivi?

Trade Federation cerca un dispositivo corrispondente a device_requirements (in genere la versione del dispositivo, il prodotto e così via) in ordine di apparizione del dispositivo nella configurazione. Ogni volta che viene allocato un dispositivo, TF tenta di allocare quello successivo. Se non è possibile allocare tutti i dispositivi, verranno tutti rilasciati e verrà riprovato il comando quando tutti i dispositivi saranno associati.

In che modo TF prepara i dispositivi?

Il passaggio di preparazione per l'utilizzo di più dispositivi è per lo più la stessa di quello per i dispositivi singoli. Ogni dispositivo viene preparato chiamando il <target_preparer> in ordine di visualizzazione all'interno del <device>.

Puoi anche utilizzare <multi_target_preparer> specificato nella radice della configurazione per attivare i passaggi di preparazione che richiedono più dispositivi, ad esempio l'accoppiamento dei dispositivi. Viene eseguito dopo il passaggio target_preparer.

Un'alternativa è <pre_multi_target_preparer>, che viene eseguito prima del passaggio target_preparer.

  • <pre_multi_target_preparer> deve essere utilizzato per la configurazione che deve essere eseguita prima della configurazione dei singoli dispositivi.
  • <multi_target_preparer> deve essere utilizzato per la configurazione che deve essere eseguita dopo la configurazione dei singoli dispositivi.

Ad esempio:

esegui il flashing del dispositivo 1 (target_preparer) esegui il flashing del dispositivo 2 (target_preparer) bluetooth connetti entrambi i dispositivi (multi_target_preparer)

Scrivere un test multi-dispositivo

Quando scrivi un normale test su un singolo dispositivo, implementi l'interfaccia IDeviceTest.

Per consentire ai test di ricevere i dispositivi sottoposti a test, puoi implementare IMultiDeviceTest o IInvocationContextReceiver.

IMultiDeviceTest fornisce una mappatura diretta del dispositivo al suo IBuildInfo, mentre IInvocationContextReceiver fornisce in un secondo momento il contesto completo (dispositivo, IBuildInfo e metadati).

Potrai quindi utilizzare le normali API di ITestDevice che TF mette a disposizione per la scrittura di test.

Non esistono ancora API per eseguire operazioni da un dispositivo all'altro, ad esempio device1.sync(device2). Se ritieni di avere un caso d'uso convincente da supportare, invia il tuo ragionamento all'elenco android-platform.

Esempio di Hello World per più dispositivi

Abbiamo aggiunto una configurazione di esempio simile a Hello World: multi-devices.xml È presente anche un esempio di implementazione multi_target_preparer HelloWorldMultiTargetPreparer che mostra come ricevere l'elenco dei dispositivi e delle relative build.

Questo è un esempio completo che prevede:

  • Allocare due dispositivi
  • Accedere a entrambi i dispositivi tramite un multi_target_preparer
  • Eseguire un test che utilizzi i due dispositivi

Una volta creato Tradefed, puoi utilizzare il seguente comando in TF Shell:

run example/multi-devices

Dovresti vedere un output contenente quanto segue:

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'

Per eseguire quanto sopra, devi avere due dispositivi connessi. Puoi controllare tramite: adb devices

Quando la chiamata è in corso, puoi monitorarla come se fossero singoli dispositivi con list i e 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

Dovresti essere in grado di vedere i dispositivi coinvolti in ogni chiamata, nonché tutti i dispositivi disponibili e il relativo stato.

Tieni presente che in questo esempio abbiamo chiamato i due dispositivi nella configurazione device1 e device2; devi assegnare un nome più descrittivo, se possibile, a seconda del tipo di dispositivo che vuoi davvero impostare.