Configuração de teste complexa

Alguns módulos de teste podem exigir etapas personalizadas de configuração e desmontagem que não podem ser executadas no próprio caso de teste. Exemplos típicos podem incluir:

  • instale outros apks (além do apk de teste)
  • enviar alguns arquivos para o dispositivo
  • executar comandos (por exemplo, adb shell pm ...)

No passado, as equipes de componentes geralmente recorriam à escrita de um teste do lado do host para realizar tais tarefas, o que requer compreensão do equipamento da Federação do Comércio e normalmente aumenta a complexidade de um módulo de teste.

Tomando emprestado do CTS, introduzimos o conceito de configuração do módulo de teste para suportar tais tarefas. A lista de tarefas comuns acima pode ser alcançada com apenas algumas linhas de configuração. Para máxima flexibilidade, você pode até implementar seu próprio preparador de destino, conforme definido por ITargetPreparer ou ITargetCleaner e configurá-los para uso em sua própria configuração de módulo de teste.

A configuração do módulo de teste para um módulo de teste é um arquivo XML obrigatório adicionado à pasta de origem do módulo de nível superior, chamada 'AndroidTest.xml'. O XML segue o formato de um arquivo de configuração usado pelo equipamento de automação de testes da Trade Federation. Atualmente as principais tags tratadas pelas configurações do módulo de teste são as tags “target_preparer” e “test”.

Preparadores de alvo

Uma tag “target_preparer”, como o nome sugere, define um preparador de destino (consulte ITargetPreparer ) que oferece um método de configuração, que é chamado antes que o módulo de teste seja executado para teste; e se a classe referenciada na tag “target_preparer” também implementar ITargetCleaner , seu método de desmontagem será invocado após a conclusão do módulo de teste.

Para usar a configuração do módulo comum integrado, adicione um novo arquivo 'AndroidTest.xml' na pasta de nível superior do seu módulo de teste e preencha-o com o seguinte conteúdo:

<?xml version="1.0" encoding="utf-8"?>
<!-- [insert standard AOSP copyright here] -->
<configuration description="Test module config for Foo">
<!-- insert options here -->
</configuration>

Como exemplo, podemos adicionar as seguintes tags de opção (no comentário “inserir” acima):

    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
        <option name="run-command" value="settings put secure accessibility_enabled 1" />
        <option name="teardown-command" value="settings put secure accessibility_enabled 0" />
    </target_preparer>

As opções configurarão o equipamento de teste para:

  1. antes que o módulo de teste seja invocado, execute o comando shell “settings put secure acessibilidade_enabled 1” no dispositivo
  2. após a conclusão do módulo de teste, execute o comando shell “settings put secure access_enabled 0”

Neste exemplo específico, a acessibilidade é habilitada/desabilitada antes/depois da execução do módulo de teste, respectivamente. Com um exemplo simples demonstrado, é necessário abordar mais detalhes sobre como a tag “option” é utilizada. Conforme mostrado acima, a tag pode ter dois atributos: nome, valor. O atributo name deve referir-se a uma das opções oferecidas pelo preparador.

A finalidade exata do campo de valor depende de como o preparador definiu a opção: pode ser uma string, um número, um booleano ou até mesmo um caminho de arquivo. Aqui está um resumo dos três preparadores de destino comuns:

  • nome da classe: PushFilePreparer

    • nome curto : arquivo push
    • função : envia arquivos arbitrários da pasta do caso de teste para o destino no dispositivo
    • notas :
      • este preparador pode enviar de pasta para pasta ou de arquivo para arquivo; ou seja, você não pode enviar um arquivo para uma pasta no dispositivo: você também deve especificar o nome do arquivo de destino nessa pasta
    • opções :
      • push-file: Uma especificação push, especificando o arquivo local para o caminho onde ele deve ser enviado no dispositivo. Pode ser repetido. Se vários arquivos estiverem configurados para serem enviados para o mesmo caminho remoto, o mais recente será enviado.
      • push: (obsoleto) Uma especificação push, formatada como ' /path/to/srcfile.txt->/path/to/destfile.txt ' ou ' /path/to/srcfile.txt->/path/to/destdir/ '. Pode ser repetido. Este caminho pode ser relativo ao diretório do módulo de teste ou ao próprio diretório out.
      • post-push: Um comando para executar no dispositivo (com ` adb shell <your command> `) após todas as tentativas de push. O caso de uso típico seria usar chmod para permissões
  • nome da classe: InstallApkSetup

    • nome curto: install-apk
    • função: envia arquivos apk arbitrários para o destino no dispositivo
    • opções:
      • test-file-name: o nome do apk a ser instalado no dispositivo.
      • install-arg: Argumentos adicionais a serem passados ​​para o comando pm install, incluindo traço inicial, por exemplo, “-d". Pode ser repetido
  • nome da classe: RunCommandTargetPreparer

    • nome curto: comando de execução
    • função: executa comandos shell arbitrários antes ou depois da execução do módulo de teste
    • opções:
      • comando de execução: comando adb shell para ser executado. Pode ser repetido
      • comando teardown: comando adb shell para ser executado durante a fase de desmontagem. Pode ser repetido

Aula de teste

Uma classe de teste é a classe Trade Federation a ser usada para executar o teste.

<test class="com.android.tradefed.testtype.AndroidJUnitTest">
  <option name="package" value="android.test.example.helloworld"/>
  <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
</test>

Aqui estão três classes de teste comuns:

  • nome da classe: GTest

    • nome curto: gtest
    • função: um teste que executa um pacote de teste nativo em determinado dispositivo.
    • opções:
      • caminho do dispositivo de teste nativo: o caminho no dispositivo onde os testes nativos estão localizados.
  • nome da classe: InstrumentationTest

    • nome curto: instrumentação
    • função: um teste que executa um pacote de teste de instrumentação em determinado dispositivo
    • opções:
      • pacote: o nome do pacote de manifesto do aplicativo de teste Android a ser executado.
      • class: O nome da classe de teste a ser executada.
      • método: o nome do método de teste a ser executado.
  • nome da classe: AndroidJUnitTest

    • função: um teste que executa um pacote de teste de instrumentação em determinado dispositivo usando android.support.test.runner.AndroidJUnitRunner Esta é a principal forma de executar um teste de instrumentação.