VTS oferece suporte a testes que exigem interação entre vários dispositivos Android.
Arquitetura
VTS usa a estrutura TradeFed para obter e passar números de série de dispositivos para módulos de teste.
Os requisitos do dispositivo, como número de dispositivos e tipos de dispositivos, são especificados na configuração do plano de testes. 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 dispositivos disponíveis que satisfazem os 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 utilizando. Os binários do agente VTS são então enviados e executados em todos os dispositivos alocados (a menos que seja 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 alvo podem ser únicos ou multi-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ária (versões futuras permitirão a configuração em nível de módulo).
- Receba apenas um serial do dispositivo.
- 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 números de série dos dispositivos
- 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 testes são livres para projetar outros modelos).
Tipo 1: testes HAL do lado do host
Os testes HAL do lado do host podem usar drivers VTS HAL que são enviados aos dispositivos por padrão:
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 agentes 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:
Neste cenário:
- A lógica de teste é executada no host.
- O aplicativo agente (ou binário) é instalado em cada dispositivo.
- O script de teste do host emite comandos para aplicativos em cada dispositivo.
- O lado do host coordena as interações do dispositivo.
Por exemplo, os testes do próximo bilhão de usuários no repositório VTS atual são testes de vários dispositivos, baseados em aplicativos e no lado do host.
Tipo 3: testes HIDL do lado alvo
Os testes HIDL de vários dispositivos no lado do destino colocam toda a lógica de teste em binários de teste no lado do dispositivo, o que exige que os testes sincronizem os dispositivos durante a execução do teste:
Neste cenário:
- A lógica de teste é executada nos dispositivos.
- A estrutura do lado do host fornece identificação inicial do dispositivo.
- O binário de teste do lado do destino requer sincronização:
- 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 build e um preparador de destino
VtsDeviceInfoCollector
. - O dispositivo 2 inclui um preparador
FilePusher
adicional que envia um grupo de arquivos relacionados controlados por 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 testes, consulte Preparadores de testes . Para obter um exemplo completo de vários dispositivos no 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')