VTS supporta i test che richiedono l'interazione tra più dispositivi Android dispositivi mobili.
Architettura
VTS utilizza il framework TradeFed per ottenere e superare i numeri di serie dei dispositivi per testare moduli.
I requisiti dei dispositivi, come il numero di dispositivi e tipi di dispositivi, sono: è specificato nella configurazione del piano di test. Ad esempio, puoi specificare un piano di test che richiede due dispositivi Android con target di build Sailfish.
Assegnazione dei dispositivi
L'infrastruttura di test (di solito lo scheduler dei test) alloca di dispositivi che soddisfano i requisiti specificati nella configurazione del piano di test il framework VTS. I dispositivi allocati sono riservati al piano di test anche se per il modulo di test non li utilizza. I file binari degli agenti VTS vengono poi eseguiti su tutti i dispositivi allocati (a meno che non venga specificamente indicato di non eseguire). Ciò garantisce che le connessioni TCP per i comandi shell e le RPC HAL siano disponibili i dispositivi in uno script di test.
Preparatori agli esami
Il framework esegue strumenti di preparazione ai test per tutti i dispositivi per i quali ha ricevuto numeri di serie. I preparativi possono essere uno o più dispositivi:
- Preparatori del targeting per dispositivo singolo (esempio su
VtsDeviceInfoCollector):
- .
- Può essere specificato solo nella configurazione del piano di test con il requisito elenco dei dispositivi (le versioni future consentiranno la configurazione a livello di modulo).
- Ricevi un solo numero di serie del dispositivo.
- Eseguire attività di preparazione e pulizia su un dispositivo specifico.
- Preparatori del targeting per più dispositivi (ad esempio,
VtsPythonVirtualenvPreparer):
- .
- Può essere specificato nella configurazione del piano di test o nel modulo di test configurazione
- Ricevi tutti i numeri di serie del dispositivo
- Esegui attività di preparazione e pulizia per ogni dispositivo o per tutti i dispositivi.
Moduli di test
I moduli di test ricevono un elenco dei dispositivi al termine della configurazione da parte dei preparativi l'host/i dispositivi. Viene eseguito un modulo di test Python lato host per ogni multi-dispositivo di Google Cloud. I dispositivi Android allocati sono accessibili dai moduli di test Python sotto forma di elenco Dispositivo Android oggetti:
devices = self.android_devices device1 = devices[0] device1_serial = device1.serial
Tutti i dispositivi allocati sono riservati per il piano di test, anche se un test del piano utilizza un solo dispositivo.
Comunicazione del dispositivo durante il test
I test multi-Android efficaci prevedono la comunicazione tra dispositivi mobili. Durante lo sviluppo di questi test, è necessario determinare 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 modelli di machine learning).
Tipo 1: test HAL lato host
I test HAL lato host possono utilizzare i driver VTS HAL che vengono inviati ai dispositivi valore predefinito:
In questo scenario:
- La logica di test viene eseguita sull'host.
- Lo script di test lato host invia le chiamate RPC ai driver su ciascun dispositivo.
- Interazioni con i dispositivi basate sulle coordinate laterali dell'host.
Tipo 2: test basati su agenti lato host
Anziché utilizzare agenti VTS sul dispositivo, un test lato host può anche eseguire il proprio (app o binario) a ciascun dispositivo:
In questo scenario:
- La logica di test viene eseguita sull'host.
- L'app dell'agente (o il file binario) viene installato su ogni dispositivo.
- Lo script di test lato host invia i comandi alle app su ciascun dispositivo.
- Interazioni con i dispositivi basate sulle coordinate laterali dell'host.
Ad esempio, Avanti miliardi di test relativi agli utenti nell'attuale repository VTS sono lato host, basati su app test multi-dispositivo.
Tipo 3: test HIDL lato target
I test HIDL lato target e multi-dispositivo mettono tutta la logica di test sul lato dispositivo file binari, il che richiede che i test eseguano il test per sincronizzare i dispositivi durante il test esecuzione:
In questo scenario:
- La logica di test viene eseguita sui dispositivi.
- Il framework lato host fornisce l'identificazione iniziale del dispositivo.
- Il file binario di test lato destinazione richiede la sincronizzazione:
- Stesso programma binario di test per tutti i dispositivi.
- Programmi binari di test diversi per ogni ruolo.
Esempio: piano di test multi-dispositivo
Questo esempio specifica la configurazione di due dispositivi:
- Il dispositivo 1 include un provider di build
VtsDeviceInfoCollector
: preparazione del target. - Il dispositivo 2 include un dispositivo di preparazione
FilePusher
aggiuntivo che esegue il push un gruppo di file correlati all'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 sulla preparazione agli esami, consulta Preparatori agli esami. Per un lato host completo di esempio multi-dispositivo, fai riferimento hello_world_multi codelab.
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')