O VTS oferece suporte a testes que exigem interação entre vários dispositivos dispositivos.
Arquitetura
A VTS usa o framework do TradeFed para receber e transmitir números de série do dispositivo para teste módulos.
Os requisitos de dispositivo, como número e tipos de dispositivo, são especificado na configuração do plano de teste. Por exemplo, especifique um plano de teste que requer dois dispositivos Android com destinos de build Sailfish.
Alocação de dispositivos
A infraestrutura de teste (geralmente o agendador de testes) aloca os valores dispositivos que atendam 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 módulo de teste não os está usando. Os binários do agente VTS são enviados e executados todos os dispositivos alocados (a menos que sejam instruídos especificamente para não serem executados). Isso garante que as conexões TCP para comandos shell e RPCs da HAL estejam disponíveis para todos em um script de teste.
Preparadores de teste
O framework executa preparadores de teste para todos os dispositivos em que recebeu e 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):
- Só pode ser especificado na configuração do plano de teste com o valor lista de dispositivos. As versões futuras vão permitir a configuração no nível do módulo.
- Receber apenas um número de série do dispositivo.
- Executar tarefas de preparação e limpeza em um dispositivo específico
- Preparadores de segmentação para vários dispositivos (exemplo em
VtsPythonVirtualenvPreparer):
- Pode ser especificado na configuração do plano de teste ou no módulo de teste configuração
- Receber todos os números de série do dispositivo
- Execute tarefas de preparação e limpeza para cada ou todos os dispositivos.
Módulos de teste
Os módulos de teste recebem uma lista de dispositivos depois que os preparadores de teste terminam de configurar host/dispositivos. Um módulo de teste Python no lado do host é executado para cada dispositivo multidispositivo módulo de teste. Os dispositivos Android alocados podem ser acessados nos módulos de teste do Python. como uma lista de AndroidDevice (link em inglês) objetos:
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 do plano no plano usa apenas um dispositivo.
Comunicação do dispositivo durante o teste
Os testes multiAndroid eficazes envolvem a comunicação entre dispositivos. Ao desenvolver esses testes, você deve determinar como estabelecer 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 criar outros modelos de machine learning).
Tipo 1: testes de HAL do lado do host
Os testes de HAL do lado do host podem usar drivers de HAL VTS que são enviados aos dispositivos padrão:
Nesse caso:
- A lógica de teste é executada no host.
- O script de teste do lado 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 no lado do host
Em vez de usar agentes VTS no dispositivo, um teste no lado do host também pode realizar a própria (app ou binário) para cada dispositivo:
Nesse caso:
- A lógica de teste é executada no host.
- O app agente (ou binário) é instalado em cada dispositivo.
- O script de teste do lado do host emite comandos para apps em cada dispositivo.
- O lado do host coordena as interações do dispositivo.
Por exemplo, o Próxima Bilhões de testes de usuários (em inglês) no repositório atual do VTS são feitos no lado do host, são baseados em apps nos testes multidispositivo.
Tipo 3: testes HIDL do lado do destino
Os testes HIDL com vários dispositivos no lado do alvo colocam toda a lógica no teste do lado do dispositivo , que exige que os testes sincronizem os dispositivos durante o teste execução:
Nesse caso:
- A lógica de teste é executada nos dispositivos.
- O framework do lado do host fornece identificação inicial do dispositivo.
- O binário de teste do destino requer sincronização:
- O mesmo binário de teste para todos os dispositivos.
- Binários de teste diferentes para cada papel.
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
Preparador de meta de
VtsDeviceInfoCollector
. - O dispositivo 2 inclui um preparador
FilePusher
extra que envia um grupo de arquivos relacionados ao host ao 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 no lado do host
Para mais detalhes e exemplos sobre preparadores de teste, consulte Preparadores de teste. Para um conjunto de dados completo exemplo para vários dispositivos, consulte 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')