Executar testes com vários dispositivos

Esta página ajuda você a usar o Trade Federation Test Harness com vários dispositivos durante os testes.Primeiro, familiarize-se com o uso normal, conforme descrito no exemplo completo.

O que muda com vários dispositivos?

Várias coisas são diferentes ao configurar e executar testes em vários dispositivos na Trade Federation, em particular:

Qualquer configuração de um dispositivo é válida para o modo de vários dispositivos.

<! -- TODO: Esclareça a frase imediatamente acima adicionando um exemplo de um caso de uso de um dispositivo, já que ele se refere ao modo de vários dispositivos em uma segunda frase. -->>

Configuração de vários dispositivos

Este documento pressupõe que você já conhece a configuração típica de teste do TF. Confira como é uma configuração de teste típica com dois dispositivos:

<configuration description="A simple multi-devices example in Tradefed">

    <device name="device1">
        <target_preparer class="com.android.tradefed.targetprep.DeviceSetup" />
    </device>

    <device name="device2">
        <target_preparer class="com.android.tradefed.targetprep.DeviceSetup" />
    </device>

    <option name="log-level" value="verbose" />
    <test class="com.android.tradefed.HelloWorldMultiDevices" />

    <logger class="com.android.tradefed.log.FileLogger" />
    <result_reporter class="com.android.tradefed.result.ConsoleResultReporter" />

</configuration>

Várias coisas precisam ser mencionadas sobre a estrutura:

  • Para cada dispositivo que será necessário, é esperado um <device>.
  • <build_provider>, <target_preparer>, <device_recovery>, <device_requirements> e <device_options>, se necessário, precisam ser incluídos na tag <device>. Caso contrário, uma exceção será gerada.
  • o atributo name para <device> é obrigatório e precisa ser único entre todos os dispositivos presentes na configuração. Ele é usado para fazer referência ao dispositivo específico associado a ele. Isso permite que o teste seja direcionado a um dispositivo específico.
  • <option> pode ter um escopo global quando está na raiz da configuração ou ser limitado ao escopo do dispositivo quando especificado dentro da tag <device>.

Todas as outras regras aplicáveis à configuração de um único dispositivo ainda são válidas aqui. Confira o exemplo Hello World abaixo para mais detalhes.

Atualização da linha de comando

Ao especificar opções na linha de comando do TF, também é possível especificar um escopo de dispositivo usando {<device name>}, em que <device name> é o nome especificado na configuração XML.

No exemplo acima, as seguintes opções foram permitidas:

  • --com.android.tradefed.targetprep.DeviceSetup:disable
  • --device-setup:disable

Só é possível segmentar um dos objetos build_provider do dispositivo usando o nome do dispositivo, desta forma:

--{device2}device-setup:disable

Neste exemplo, device2 pula a configuração do dispositivo, enquanto device1 não pula.

Como o TF seleciona os dispositivos?

A Trade Federation procura um dispositivo que corresponda ao device_requirements (normalmente o tipo, o produto etc.) na ordem de aparição do dispositivo na configuração. Sempre que um dispositivo é alocado, o TF tenta alocar o próximo. Se não for possível alocar todos os dispositivos, eles serão liberados e o comando será tentado novamente quando todos os dispositivos forem correspondidos.

Como o TF prepara os dispositivos?

A etapa de preparação para vários dispositivos é basicamente a mesma para dispositivos únicos. Cada dispositivo é preparado chamando o <target_preparer> em ordem de aparência dentro do <device>.

Você também pode usar <multi_target_preparer> especificado na raiz da configuração que ativa etapas de preparação que exigem vários dispositivos, como o pareamento de dispositivos. Ele é executado após a etapa target_preparer.

Uma alternativa é <pre_multi_target_preparer>, que é executado antes da etapa target_preparer.

  • O <pre_multi_target_preparer> precisa ser usado para a configuração que precisa ser feita antes da configuração de dispositivos individuais.
  • O <multi_target_preparer> precisa ser usado para a configuração que precisa ser feita depois das configurações individuais do dispositivo.

Exemplo:

Atualizar o dispositivo 1 (target_preparer) Atualizar o dispositivo 2 (target_preparer) Conectar os dois dispositivos por Bluetooth (multi_target_preparer)

Criar um teste multidispositivo

Ao escrever um teste regular de um único dispositivo, você implementa a interface IDeviceTest.

Para que os testes recebam os dispositivos em teste, implemente IMultiDeviceTest ou IInvocationContextReceiver.

O IMultiDeviceTest fornece um mapeamento direto do dispositivo para o IBuildInfo, enquanto o IInvocationContextReceiver oferece o contexto completo (dispositivo, IBuildInfo e metadados) mais tarde.

Em seguida, você poderá usar as APIs ITestDevice que o TF disponibilizou para a gravação de testes.

Ainda não existem APIs para realizar operações de um dispositivo para outro, como device1.sync(device2). Se você acha que tem um caso de uso convincente para receber suporte, envie seu raciocínio para a lista android-platform.

Exemplo de "Hello World" em vários dispositivos

Adicionamos uma configuração de exemplo parecida com "Hello World": multi-devices.xml Também há um exemplo de implementação de multi_target_preparer HelloWorldMultiTargetPreparer que mostra como receber a lista de dispositivos e os builds deles.

Este é um exemplo completo que envolve:

  • Alocação de dois dispositivos
  • Acessar os dois dispositivos por um multi_target_preparer
  • Como executar um teste que usa os dois dispositivos

Depois de criar o Tradefed, use o seguinte comando no shell do TF:

run example/multi-devices

Você vai encontrar uma saída que contém o seguinte:

08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device '00b4e73b4cbcd162' with build id '3146108'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device 'LP5A390056' with build id '3146108'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device '00b4e73b4cbcd162' from context with build 'com.android.tradefed.build.DeviceBuildInfo@c99cbc1'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device 'LP5A390056' from context with build 'com.android.tradefed.build.DeviceBuildInfo@b41f20c5'

Você precisa de dois dispositivos conectados para executar o procedimento acima. Isso pode ser verificado em: adb devices

Quando a invocação estiver em andamento, você poderá monitorá-la como dispositivos únicos com list i e list d:

tf >list i
Command Id  Exec Time  Device                          State
1           0m:35      [00b4e73b4cbcd162, LP5A390056]  fetching build
tf >list d
Serial            State      Product   Variant   Build   Battery
00b4e73b4cbcd162  Allocated  bullhead  bullhead  NRD90O  100
LP5A390056        Allocated  shamu     shamu     NRD90I  100

Você poderá ver os dispositivos envolvidos em cada invocação, bem como todos os dispositivos disponíveis e o estado deles.

Neste exemplo, chamamos os dois dispositivos na configuração device1 e device2. Dê um nome mais descritivo, se possível, dependendo do tipo de dispositivo que você realmente espera que seja definido.