VTS supporta i test che richiedono l'interazione tra più dispositivi Android.
Architettura
VTS utilizza il framework TradeFed per ottenere 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 (di solito lo scheduler di test) alloca i dispositivi disponibili che soddisfano i requisiti specificati nella configurazione del piano di test al framework VTS. 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 poi inviati ed eseguiti su tutti i dispositivi allocati (a meno che non sia stato specificato di non eseguirli). In questo modo, le connessioni TCP per i comandi shell e le RPC HAL sono disponibili per tutti i dispositivi in uno script di test.
Preparatori di test
Il framework esegue i preparatori dei test per tutti i dispositivi per i quali ha ricevuto i numeri di serie. I preparatori di target possono essere singoli o multi-dispositivo:
- Preparatori di target per un singolo dispositivo (esempio in
VtsDeviceInfoCollector):
- Può essere specificato solo nella configurazione del piano di test con l'elenco dei dispositivi richiesti (le versioni future consentiranno la configurazione a livello di modulo).
- Ricevi un solo numero di serie del dispositivo.
- Esegui attività di preparazione e pulizia su un dispositivo specifico.
- Preparatori di 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.
Moduli di test
I moduli di test ricevono un elenco di dispositivi dopo che i preparatori del test hanno terminato la configurazione dell'host/dei dispositivi. Per ogni modulo di test multi-dispositivo viene eseguito un modulo di test Python lato host. 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 determinare come stabilire la comunicazione tra i dispositivi allocati. Le sezioni seguenti forniscono tre esempi di comunicazione (tuttavia, gli sviluppatori dei test sono liberi di progettare altri modelli).
Tipo 1: test HAL lato host
I test HAL lato host possono utilizzare i driver HAL VTS che vengono 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 il dispositivo.
Tipo 2: test basati su agenti lato host
Anziché utilizzare agenti VTS sul dispositivo, un test lato host può anche eseguire il push del proprio agente (app o binario) su ciascun dispositivo:
In questo scenario:
- La logica di test viene eseguita sull'host.
- L'app (o il binario) dell'agente 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 il dispositivo.
Ad esempio, i test Next Billion User nel repository VTS attuale sono test lato host, basati su app e multi-dispositivo.
Tipo 3: test HIDL lato target
I test HIDL multidevice 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 del test:
In questo scenario:
- La logica di test viene eseguita sui dispositivi.
- Il framework lato host fornisce l'identificazione iniziale del dispositivo.
- Il binario di test lato target richiede la sincronizzazione:
- Lo stesso binario di test per tutti i dispositivi.
- Binari di test diversi per ogni ruolo.
Esempio: piano di test su più dispositivi
Questo esempio specifica la configurazione per due dispositivi:
- Il dispositivo 1 include un fornitore di build e
VtsDeviceInfoCollector
uno strumento di preparazione del target. - Il dispositivo 2 include un preparatore
FilePusher
aggiuntivo che trasferisce un gruppo di file correlati basati sull'host al 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 preparatori di test, vedi Preparatori di 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')