Criar um teste sem dispositivo no lado do host no TF

Esta página explica como escrever um teste do lado do host que não exige um dispositivo, como um teste executado em uma instância do Linux GCE. Para saber mais sobre como criar um teste orientado pelo host que requer um dispositivo, consulte Criar um teste orientado pelo host na Trade Federation.

Tipos de teste do lado do host

É possível executar vários tipos de testes do lado do host pela Trade Federation (TF).

Testes nativos (gtest)

Crie testes nativos (gtests) para testar uma plataforma. Se o teste não exigir um dispositivo, execute-o em um host. Dessa forma, o teste será executado muito mais rápido. Para configurar esses testes para serem executados em um host de teste, use o executor de TF HostGTest.

Este é um exemplo de configuração de teste da TradeFed:

<configuration description="Runs hello_world_test.">
    <option name="null-device" value="true" />
    <test class="com.android.tradefed.testtype.HostGTest" >
        <option name="module-name" value="hello_world_test" />
    </test>
</configuration>

A configuração do teste executa um teste gtest (hello_world_test) em um host. A configuração de teste de exemplo pode ser gerada automaticamente. A menos que o teste precise de uma configuração ou limpeza especial, você pode usar a geração automática de configurações de teste para criar configurações de teste adequadas do TF.

Para configurar um gtest do host e ativar a geração automática de configuração de teste, defina host_supported como true em Android.bp, como em hello_world_test.

Para mais informações sobre como escrever um teste nativo, consulte Adicionar um novo exemplo de teste nativo.

Testes de host JAR

Os testes de host JAR (Java), como JUnit, são testes que não precisam ser executados em um dispositivo e que fornecem cobertura de código do projeto Java. Esses testes podem ser configurados para serem executados em um host de teste usando o HostTest do runner.

Exemplo de configuração de teste da TradeFed

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.HostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

A configuração do teste executa um teste JUnit do lado do host de HelloWorldHostTest. A configuração de teste acima pode ser gerada automaticamente. A menos que o teste precise de configuração ou limpeza especial, use a geração automática de configuração de teste para criar a configuração de teste correta da TradeFed.

Para mais detalhes sobre como escrever um teste de host JAR, consulte a página Testes de host JAR (Java).

Testes de host Java isolados

Os testes Java sem dispositivo podem ser executados em um ambiente isolado com um pequeno custo de desempenho. No entanto, há algumas considerações importantes a serem feitas antes de escolher usar esse ambiente.

  • Esse é o executor padrão usado para testes de unidade do Robolectric e do JUnit.
  • O Tradefed oferece suporte apenas a testes JUnit no ambiente de isolamento.
  • Somente dependências vinculadas de forma estática são aceitas. Nenhuma dependência declarada com lib é incluída no caminho de classe.
  • O executor de isolamento só coloca o shim runner e o jar de teste no classpath.
  • Há uma quantidade fixa de sobrecarga por execução de teste executada com esse executor.

Exemplo de configuração de teste da Tradefed (isolado)

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.IsolatedHostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

Exemplo de configuração do Soong para a geração automática

Em vez de criar manualmente a configuração de teste como acima, o Soong pode gerar automaticamente a configuração usando uma declaração como este exemplo.

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

    srcs: ["test/**/*.java"],

    static_libs: [
        "junit",
    ],
}

Testes Robolectric

Os testes do Robolectric usam o mesmo executor dos testes de host isolados, com algumas opções especiais.

  • A opção robolectric-resources permite que algumas opções de linha de comando específicas do Robolectric sejam transmitidas ao subprocesso e adiciona o build de árvore de android-all ao caminho de classe do subprocesso. Enquanto as outras duas são práticas recomendadas, essa opção é obrigatória para executar testes Robolectric com sucesso.
  • A opção java-folder permite mudar o ambiente de execução Java usado pelo subprocesso. Isso é necessário porque o Robolectric prefere versões específicas do Java que podem não estar alinhadas com a JVM preferida do sistema host.
  • A opção exclude-paths permite que o executor de subprocesso evite carregar módulos específicos, o que é útil quando um JAR vem com classes estranhas que podem causar erros de carregamento. java. é uma exclusão comum para evitar a geração de exceções SecurityException.

Exemplo de configuração do Robolectric

<configuration description="Executes a Sample Robolectric Test">
    <option name="java-folder" value="prebuilts/jdk/jdk9/linux-x86/" />
    <option name="exclude-paths" value="java" />
    <option name="use-robolectric-resources" value="true" />
    <test class="com.android.tradefed.testtype.IsolatedHostTest">
        <option name="jar" value="RobolectricExampleTest.jar" />
    </test>
</configuration>

Exemplo de configuração do Soong para a geração automática do Robolectric

Em vez de criar manualmente a configuração de teste como acima, o Soong pode gerar automaticamente a configuração usando uma declaração como este exemplo.

android_robolectric_test {
    name: "HelloWorldRoboTest",
    srcs: [
        "src/**/*.java",
    ],

    // Include the testing libraries
    static_libs: [
        "mockito-robolectric-prebuilt",
        "platform-test-annotations",
        "testng",
        "truth-prebuilt",
    ],

    instrumentation_for: "HelloWorldApp",
}

Teste do Python

Se a lógica de teste for escrita em Python, use o tipo de build python_test_host para criar um arquivo par que possa ser executado pelo PythonBinaryHostTest do TF.

Exemplo de configuração de teste da TradeFed

<configuration description="Config to run atest unittests">
    <test class="com.android.tradefed.testtype.python.PythonBinaryHostTest" >
        <option name="par-file-name" value="atest_unittests" />
        <option name="test-timeout" value="2m" />
    </test>
</configuration>

Configuração do pacote de testes

Para que o teste do host seja acessível pelo TF para um determinado build, defina a configuração `test_suites` do módulo de teste como `general-tests`:

test_suites: ["general-tests"],

Com essa configuração, o teste é empacotado para general-tests.zip no destino test_suites.