Teste de vários dispositivos

O VTS oferece suporte a testes que exigem interação entre vários dispositivos Android.

Arquitetura

O VTS usa a estrutura TradeFed para obter e passar seriais de dispositivos para módulos de teste.

Figura 1. Séries de dispositivos de passagem VTS.

Os requisitos do dispositivo, como número de dispositivos e tipos de dispositivos, são especificados na configuração do plano de teste. Por exemplo, você pode especificar um plano de teste que requer dois dispositivos Android com destinos de compilação Sailfish.

Alocação de dispositivos

A infraestrutura de teste (geralmente o agendador de teste) aloca os dispositivos disponíveis que atendem aos requisitos especificados na configuração do plano de teste para a estrutura VTS. Os dispositivos alocados são reservados para o plano de teste mesmo que o módulo de teste não os esteja usando. Os binários do agente VTS são então enviados e executados em todos os dispositivos alocados (a menos que especificamente instruído a não executar). Isso garante que as conexões TCP para comandos shell e RPCs HAL estejam disponíveis para todos os dispositivos em um script de teste.

Preparadores de teste

A estrutura executa preparadores de teste para todos os dispositivos para os quais recebeu números de série. Os preparadores de destino podem ser de um ou vários dispositivos:

  • Preparadores de destino de dispositivo único (exemplo em VtsDeviceInfoCollector ):
    • Pode ser especificado apenas na configuração do plano de teste com a lista de dispositivos necessários (versões futuras permitirão a configuração em nível de módulo).
    • Receba apenas um dispositivo serial.
    • Execute tarefas de preparação e limpeza em um dispositivo específico.
  • Preparadores de destino para vários dispositivos (exemplo em VtsPythonVirtualenvPreparer ):
    • Pode ser especificado na configuração do plano de teste ou na configuração do módulo de teste
    • Receba todos os seriais do dispositivo
    • Execute tarefas de preparação e limpeza para cada dispositivo ou todos os dispositivos.

Módulos de teste

Os módulos de teste obtêm uma lista de dispositivos depois que os preparadores de teste terminam de configurar o host/dispositivos. Um módulo de teste Python do lado do host é executado para cada módulo de teste de vários dispositivos. Os dispositivos Android alocados podem ser acessados ​​nos módulos de teste do Python como uma lista de objetos AndroidDevice :

devices = self.android_devices
device1 = devices[0]
device1_serial = device1.serial

Todos os dispositivos alocados são reservados para o plano de teste, mesmo que um módulo de teste no plano esteja usando apenas um dispositivo.

Comunicação do dispositivo durante o teste

Testes multi-Android eficazes envolvem comunicação entre dispositivos alocados. Ao desenvolver tais testes, você deve determinar como estabelecer a comunicação entre os dispositivos alocados. As seções a seguir fornecem três exemplos de comunicação (no entanto, os desenvolvedores de teste são livres para projetar outros modelos).

Tipo 1: testes HAL do lado do host

Os testes de HAL do lado do host podem usar drivers VTS HAL que são enviados para dispositivos por padrão:

Figura 2. Teste HAL do lado do host.

Neste cenário:

  • A lógica de teste é executada no host.
  • O script de teste do host emite chamadas RPC para os drivers em cada dispositivo.
  • O lado do host coordena as interações do dispositivo.

Tipo 2: testes baseados em agente do lado do host

Em vez de usar agentes VTS no dispositivo, um teste do lado do host também pode enviar seu próprio agente (aplicativo ou binário) para cada dispositivo:

Figura 3. Teste baseado em agente do lado do host.

Neste cenário:

  • A lógica de teste é executada no host.
  • O aplicativo do agente (ou binário) é instalado em cada dispositivo.
  • O script de teste do lado do host emite comandos para aplicativos em cada dispositivo.
  • O lado do host coordena as interações do dispositivo.

Por exemplo, os testes Next Billion User no repositório VTS atual são testes de vários dispositivos do lado do host, baseados em aplicativos.

Tipo 3: testes HIDL do lado do alvo

Os testes HIDL de vários dispositivos do lado do destino colocam toda a lógica de teste nos binários de teste do lado do dispositivo, o que exige que os testes sincronizem os dispositivos durante a execução do teste:

Figura 4. Teste HIDL baseado em alvo.

Neste cenário:

  • A lógica de teste é executada nos dispositivos.
  • A estrutura do lado do host fornece a identificação inicial do dispositivo.
  • O binário de teste do lado do destino requer sincronização:
    • Mesmo binário de teste para todos os dispositivos.
    • Diferentes binários de teste para cada função.

Exemplo: plano de teste para vários dispositivos

Este exemplo especifica a configuração para dois dispositivos:

  • O dispositivo 1 inclui um provedor de compilação e um preparador de destino VtsDeviceInfoCollector .
  • O dispositivo 2 inclui um preparador FilePusher adicional que envia um grupo de arquivos relacionados ao host para o 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>

Exemplo: script de teste Python do lado do host

Para obter detalhes e exemplos sobre preparadores de teste, consulte Preparadores de teste . Para obter um exemplo completo de vários dispositivos do lado do host, consulte o 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')