VTS supporta i test che richiedono l'interazione tra più dispositivi Android.
Architettura
VTS utilizza il framework TradeFed per recuperare e trasmettere i numeri di serie dei dispositivi ai moduli di test.
I requisiti dei dispositivi, come il numero di dispositivi e i tipi di dispositivi, sono specificati nella configurazione del piano di test. Ad esempio, puoi specificare un piano di test che richiede due dispositivi Android con target di build Sailfish.
Allocazione dei dispositivi
L'infrastruttura di test (in genere il programmatore dei test) alloca al framework VTS i dispositivi disponibili che soddisfano i requisiti specificati nella configurazione del piano di test. I dispositivi allocati sono riservati al piano di test anche se il modulo di test non li utilizza. I file binari dell'agente VTS vengono quindi inviati e eseguiti su tutti i dispositivi allocati (a meno che non venga specificato di non eseguirli). In questo modo, si assicura che le connessioni TCP per i comandi shell e le RPC HAL siano disponibili per tutti i dispositivi in uno script di test.
Preparatori dei test
Il framework esegue i preparativi per i test per tutti i dispositivi per i quali ha ricevuto i numeri di serie. I Preparatori target possono essere singoli o multi-dispositivo:
- Preparatori dei target per un solo dispositivo (esempio in
VtsDeviceInfoCollector):
- Può essere specificato solo nella configurazione del piano di test con l'elenco di dispositivi richiesto (le versioni future consentiranno la configurazione a livello di modulo).
- Ricevere un solo numero di serie del dispositivo.
- Esegui attività di preparazione e pulizia su un dispositivo specifico.
- Preparatori target multi-dispositivo (esempio in
VtsPythonVirtualenvPreparer):
- Può essere specificato nella configurazione del piano di test o nella configurazione del modulo di test
- Ricevere tutti i numeri di serie dei dispositivi
- Esegui le attività di preparazione e pulizia per ogni dispositivo o per tutti i dispositivi.
Testare i moduli
I moduli di test ricevono un elenco di dispositivi dopo che i responsabili della preparazione dei test hanno completato la configurazione dell'host/dei dispositivi. Viene eseguito un modulo di test Python lato host per ogni modulo di test su più dispositivi. I dispositivi Android allocati sono accessibili dai moduli di test Python come elenco di oggetti AndroidDevice:
devices = self.android_devices device1 = devices[0] device1_serial = device1.serial
Tutti i dispositivi allocati sono riservati al piano di test, anche se un modulo di test nel piano utilizza un solo dispositivo.
Comunicazione del dispositivo durante il test
Test multi-Android efficaci prevedono la comunicazione tra i dispositivi allocati. Quando sviluppi questi test, devi stabilire come stabilire la comunicazione tra i dispositivi allocati. Le sezioni seguenti forniscono tre esempi di comunicazione (tuttavia, gli sviluppatori di test sono liberi di progettare altri modelli).
Tipo 1: test HAL lato host
I test HAL lato host possono utilizzare i driver HAL VTS inviati ai dispositivi per impostazione predefinita:
In questo scenario:
- La logica di test viene eseguita sull'host.
- Lo script di test lato host invia chiamate RPC ai driver su ogni dispositivo.
- Il lato host coordina le interazioni con i dispositivi.
Tipo 2: test basati su agenti lato host
Anziché utilizzare gli agenti VTS sul dispositivo, un test lato host può anche inviare il proprio agente (app o file binario) a ogni dispositivo:
In questo scenario:
- La logica di test viene eseguita sull'host.
- L'app agente (o il file binario) viene installata su ogni dispositivo.
- Lo script di test lato host invia comandi alle app su ogni dispositivo.
- Il lato host coordina le interazioni con i dispositivi.
Ad esempio, i test per il prossimo miliardo di utenti nell'attuale repository VTS sono test su più dispositivi basati su app e lato host.
Tipo 3: test HIDL lato target
I test HIDL multi-dispositivo lato target inseriscono tutta la logica di test nei file binari di test lato dispositivo, il che richiede la sincronizzazione dei dispositivi durante l'esecuzione dei test:
In questo scenario:
- La logica di test viene eseguita sui dispositivi.
- Il framework lato host fornisce l'identificazione iniziale del dispositivo.
- Il programma binario di test lato target richiede la sincronizzazione:
- Stesso file binario di test per tutti i dispositivi.
- Binari di test diversi per ogni ruolo.
Esempio: piano di test multi-dispositivo
Questo esempio specifica la configurazione per due dispositivi:
- Il dispositivo 1 include un provider di build e un preparatore del target
VtsDeviceInfoCollector
. - Il dispositivo 2 include un altro
FilePusher
preparer che spinge un gruppo di file correlati basati sull'host sul dispositivo.
<configuration description="VTS Codelab Plan"> ... <device name="device1"> <build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" /> <target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" /> </device> <device name="device2" > <build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" /> <target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" /> <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher"> <option name="push-group" value="HostDrivenTest.push" /> </target_preparer> </device> <option name="compatibility:include-filter" value="VtsCodelabHelloWorldMultiDeviceTest" /> </configuration>
Esempio: script di test Python lato host
Per dettagli ed esempi sui preparativi per i test, consulta Preparativi per i test. Per un esempio completo di più dispositivi lato host, consulta il codelab hello_world_multi.
def setUpClass(self): logging.info('number of device: %s', self.android_devices) asserts.assertEqual(len(self.android_devices), 2, 'number of device is wrong.') self.dut1 = self.android_devices[0] self.dut2 = self.android_devices[1] self.shell1 = self.dut1.shell self.shell2 = self.dut2.shell def testSerialNotEqual(self): '''Checks serial number from two device not being equal.''' command = 'getprop | grep ro.serial' res1 = self.shell1.Execute(command) res2 = self.shell2.Execute(command) def getSerialFromShellOutput(output): '''Get serial from getprop query''' return output[const.STDOUT][0].strip().split(' ')[-1][1:-1] serial1 = getSerialFromShellOutput(res1) serial2 = getSerialFromShellOutput(res2) logging.info('Serial number of device 1 shell output: %s', serial1) logging.info('Serial number of device 2 shell output: %s', serial2) asserts.assertNotEqual(serial1, serial2, 'serials from two devices should not be the same') asserts.assertEqual(serial1, self.dut1.serial, 'serial got from device system property is different from allocated serial') asserts.assertEqual(serial2, self.dut2.serial, 'serial got from device system property is different from allocated serial')