Test multi-dispositivo

VTS supporta test che richiedono l'interazione tra più dispositivi Android.

Architettura

VTS utilizza il framework TradeFed per ottenere e trasmettere i seriali dei dispositivi per testare i moduli.

Figura 1. Seriali del dispositivo di passaggio VTS.

I requisiti del dispositivo, come il numero di dispositivi e i tipi di dispositivo, sono specificati nella configurazione del piano di test. Ad esempio, puoi specificare un piano di test che richiede due dispositivi Android con destinazioni di build Sailfish.

Assegnazione del dispositivo

L'infrastruttura di test (solitamente il pianificatore di test) assegna al framework VTS i dispositivi disponibili che soddisfano i requisiti specificati nella configurazione del piano di test. I dispositivi assegnati sono riservati per il piano di test anche se il modulo di test non li utilizza. I file binari dell'agente VTS vengono quindi inviati ed eseguiti su tutti i dispositivi allocati (a meno che non venga specificatamente indicato di non eseguirli). Ciò garantisce che le connessioni TCP per i comandi shell e le RPC HAL siano disponibili per tutti i dispositivi in ​​uno script di test.

Preparatori di test

Il framework esegue preparatori di test per tutti i dispositivi per i quali ha ricevuto numeri di serie. I preparatori target possono essere singoli o multi-dispositivo:

  • Preparatori di target a dispositivo singolo (esempio in VtsDeviceInfoCollector ):
    • Può essere specificato solo nella configurazione del piano di test con l'elenco dei dispositivi richiesto (le versioni future consentiranno la configurazione a livello di modulo).
    • Ricevi un solo seriale del dispositivo.
    • Esegui attività di preparazione e pulizia su un dispositivo specifico.
  • Preparatori di target multi-dispositivo (esempio su VtsPythonVirtualenvPreparer ):
    • Può essere specificato nella configurazione del piano di test o nella configurazione del modulo di test
    • Ricevi tutti i seriali del dispositivo
    • Esegui attività di preparazione e pulizia per ciascun dispositivo o tutti i dispositivi.

Moduli di prova

I moduli di test ottengono un elenco di dispositivi dopo che i preparatori del test hanno terminato di configurare l'host/i dispositivi. Viene eseguito un modulo di test Python lato host per ciascun modulo di test multi-dispositivo. I dispositivi Android assegnati 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 per il 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 implicano la comunicazione tra i dispositivi assegnati. Quando si sviluppano tali test, è necessario determinare come stabilire la comunicazione tra i dispositivi assegnati. 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 che vengono inviati ai dispositivi per impostazione predefinita:

Figura 2. Test HAL lato host.

In questo scenario:

  • La logica del test viene eseguita sull'host.
  • Lo script di test lato host invia chiamate RPC ai driver su ciascun dispositivo.
  • Il lato host coordina le interazioni del dispositivo.

Tipo 2: test basati su agenti lato host

Invece di utilizzare agenti VTS sul dispositivo, un test lato host può anche inviare il proprio agente (app o binario) a ciascun dispositivo:

Figura 3. Test lato host, basato su agente.

In questo scenario:

  • La logica del test viene eseguita sull'host.
  • L'app agente (o binaria) si installa su ogni dispositivo.
  • Lo script di test lato host invia comandi alle app su ogni dispositivo.
  • Il lato host coordina le interazioni del dispositivo.

Ad esempio, i test Next Billion User nell'attuale repository VTS sono test lato host, basati su app e multi-dispositivo.

Tipo 3: test HIDL lato target

I test HIDL multi-dispositivo lato destinazione inseriscono tutta la logica del test sui binari di test lato dispositivo, il che richiede che i test sincronizzino i dispositivi durante l'esecuzione del test:

Figura 4. Test HIDL basato sul target.

In questo scenario:

  • La logica del 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 binario di test per tutti i dispositivi.
    • Binari di test diversi per ciascun 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 di destinazione VtsDeviceInfoCollector .
  • Il dispositivo 2 include un preparatore FilePusher aggiuntivo che invia al dispositivo un gruppo di file correlati gestiti dall'host.
<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 dei test, vedere Preparatori dei test . Per un esempio multi-dispositivo lato host completo, fare riferimento al 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')