Executar testes com vários dispositivos

Esta página ajuda você a usar o arcabouço de testes do Trade Federation com vários dispositivos durante o teste.Primeiro, familiarize-se com o uso normal, conforme descrito no exemplo de ponta a ponta.

O que muda com vários dispositivos?

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

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

<! -- TODO: Clarify the sentence immediately above by adding an example of a one-device use case as it pertains to multi-device mode in a second sentence. -->>

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>

Algumas coisas precisam ser mencionadas sobre a estrutura:

  • Para cada dispositivo necessário, um <device> é esperado.
  • <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 exclusivo 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 na tag <device>.

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

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

É possível segmentar apenas um dos objetos build_provider usando o nome do dispositivo, assim:

--{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 Federação de Comércio procura um dispositivo que corresponda ao device_requirements (normalmente o tipo, o produto etc.) na ordem de aparência do dispositivo na configuração. Cada vez 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 correspondentes.

Como a TF prepara os dispositivos?

A etapa de preparação para vários dispositivos é quase igual à de um único dispositivo. Cada dispositivo é preparado chamando o <target_preparer> na ordem de aparecimento dentro do <device>.

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

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

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

Exemplo:

atualizar dispositivo 1 (target_preparer) atualizar dispositivo 2 (target_preparer) bluetooth conectar os dois dispositivos (multi_target_preparer)

Criar um teste multidispositivo

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

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

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

Em seguida, você poderá usar as APIs ITestDevice usuais que o TF disponibilizou para a criaçã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 ser compatível, envie seu raciocínio para a lista android-platform.

Exemplo de Hello World em vários dispositivos

Adicionamos uma configuração de exemplo semelhante ao 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 builds.

Este é um exemplo completo que envolve:

  • Alocar dois dispositivos
  • Acessar os dois dispositivos usando um multi_target_preparer
  • 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 ver uma saída com 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 processo 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 de device1 e device2. Se possível, dê um nome mais descritivo, dependendo do tipo de dispositivo que você espera definir.