Estrutura de AndroidTest.xml

A estrutura geral da configuração do módulo segue um padrão semelhante à configuração XML do Tradefed normal, mas com algumas restrições devido ao fato de serem executados como parte de um pacote.

Lista de tags permitidas

AndroidTest.xml ou, de forma mais ampla, a configuração do módulo pode conter apenas as seguintes tags XML: target_preparer, multi_target_preparer, test e metrics_collector.

Embora essa lista pareça restritiva, ela permite definir com precisão as necessidades de configuração do módulo de teste e a execução do teste.

OBSERVAÇÃO: consulte Configuração de XML do Tradefed se você precisar relembrar as diferentes tags.

Objetos como build_provider ou result_reporter vão gerar uma ConfigurationException se tentarem ser executados dentro de uma configuração de módulo. Isso evita a expectativa de que esses objetos realmente executem alguma tarefa em um módulo.

Exemplo de configuração de módulo

<configuration description="Config for CTS Gesture test cases">
    <option name="test-suite-tag" value="cts" />
    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
        <option name="cleanup-apks" value="true" />
        <option name="test-file-name" value="CtsGestureTestCases.apk" />
    </target_preparer>
    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
        <option name="package" value="android.gesture.cts" />
        <option name="runtime-hint" value="10m50s" />
    </test>
</configuration>

Essa configuração descreve um teste que exige a instalação de CtsGestureTestCases.apk e executa uma instrumentação no pacote android.gesture.cts.

Tags de inclusão <include> e <template-include>

O uso de <include> e <template-include> em configurações de módulo não é recomendado. Não há garantia de que eles funcionem como esperado.

Caso especial para a tag metrics_collector

O metrics_collector é permitido, mas limitado à classe FilePullerLogCollector, para especificar um determinado arquivo ou diretório a ser extraído e registrado para o módulo. Isso é útil se você estiver deixando registros em um local específico e quer recuperá-los automaticamente.

Exemplo de configuração:

<configuration description="Config for CTS UI Rendering test cases">
    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
        <option name="cleanup-apks" value="true" />
        <option name="test-file-name" value="CtsUiRenderingTestCases.apk" />
    </target_preparer>
    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
        <option name="package" value="android.uirendering.cts" />
        <option name="runtime-hint" value="11m55s" />
        <option name="runner" value="android.uirendering.cts.runner.UiRenderingRunner" />
        <option name="isolated-storage" value="false" />
    </test>

    <!-- Collect the files in the dump directory for debugging -->
    <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
        <option name="directory-keys" value="/sdcard/UiRenderingCaptures" />
        <option name="collect-on-run-ended-only" value="true" />
    </metrics_collector>
</configuration>

E quanto às informações de build ou downloads?

A definição das tags permitidas pode dar a impressão incorreta de que um módulo não vai receber informações de build. Isso não é verdade.

As informações do build são fornecidas na configuração no nível do pacote e serão compartilhadas por todos os módulos do pacote. Isso permite uma única configuração de nível superior para o pacote, a fim de executar todos os módulos dele.

Por exemplo, em vez de cada módulo do conjunto de teste de compatibilidade (CTS) consultar individualmente as informações do dispositivo, tipos etc., a configuração do nível do conjunto do CTS (cts.xml) faz isso uma vez, e cada módulo vai receber essas informações se elas forem solicitadas.

Para que os objetos em um módulo recebam as informações do build, eles precisam fazer o mesmo que na configuração normal do Tradefed: implementar a interface IBuildReceiver para receber o IBuildInfo. Consulte Como fazer testes com o dispositivo para mais detalhes.

Campos de metadados

Um grande número de módulos de teste inclui algumas especificações metadata, cada uma com uma meta única.

Exemplo:

  <option name="config-descriptor:metadata" key="component" value="framework" />
  <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
  <option name="config-descriptor:metadata" key="parameter" value="multi_abi" />
  <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />

Componente

Os metadados component descrevem o componente geral do Android que o módulo pretende testar. Ele não tem impacto direto na execução do teste, sendo usado principalmente para fins organizacionais.

A lista atualizada de componentes permitidos para CTS está disponível em CtsConfigLoadingTest. Esse teste falha na pré-envio se um componente inexistente for adicionado a um módulo CTS.

É possível filtrar uma execução de pacote com base nos componentes usando module-metadata-include-filter e module-metadata-exclude-filter.

Exemplo:

  --module-metadata-include-filter component framework

Este exemplo executa apenas o módulo de teste anotado com o componente framework.

Parâmetro

Os metadados parameter são informativos e afetam a execução do teste. Especifica a que modo do Android o módulo de teste se aplica. Nesse caso, os modos são limitados a modos de alto nível do Android, como instant apps, secondary users ou different abis.

Durante a execução do pacote, se o modo for aplicado ao teste, várias variações do módulo de teste serão criadas com base no modo. Cada variação executa testes semelhantes, mas em modos diferentes.

  • instant_app: crie uma variação dos testes que instalam APKs como apps instantâneos.
  • multi_abi: cria uma variação dos testes para cada ABI com suporte do dispositivo.
  • secondary_user: crie uma variação dos testes que instalam APKs e executam testes como um usuário secundário.

Coleta de métricas e pós-processamento para módulos de teste de desempenho

Para módulos de teste de desempenho, metrics_collector e metric_post_processor no nível do módulo são permitidos, porque são essenciais para testes de desempenho. Os coletores de métricas e pós-processadores no nível do módulo podem ser específicos do módulo. Não é recomendável especificar pós-processadores no nível superior e no nível do módulo.

Uma configuração de módulo de teste de desempenho precisa incluir os metadados test-type com o valor performance, como: xml <option name="config-descriptor:metadata" key="test-type" value="performance" /> Sem isso, se uma configuração de teste incluir um metric_collector diferente de FilePullerLogCollector ou qualquer metric_post_processor, o teste falhará no pré-envio.

Exemplo de configuração do módulo de teste de desempenho:

<configuration description="Runs sample performance test.">
    <!-- Declare as a performance test module -->
    <option name="config-descriptor:metadata" key="test-type" value="performance" />
    <option name="test-tag" value="hello-world-performance-test" />
    <test class="com.android.tradefed.testtype.HostTest" >
        <option name="class" value="android.test.example.helloworldperformance.HelloWorldPerformanceTest" />
    </test>
    <!-- Add module-level post processor MetricFilePostProcessor -->
    <metric_post_processor class="com.android.tradefed.postprocessor.MetricFilePostProcessor">
        <option name="aggregate-similar-tests" value="true" />
        <option name="enable-per-test-log" value="false" />
    </metric_post_processor>
</configuration>