Criar um teste sem dispositivo no lado do host no TF

Nesta página, explicamos 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 detalhes sobre como escrever um teste controlado pelo host que exige um dispositivo, consulte Escrever um teste controlado pelo host no Trade Federation.

Tipos de teste no lado do host

É possível executar vários tipos de testes do lado do host usando o 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. Assim, ele será executado muito mais rápido. Para configurar esses testes para serem executados em um host de teste, use o executor do TF HostGTest.

Esta é uma configuração de teste de exemplo 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 de 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 seu teste precise de uma configuração ou limpeza especial, você pode usar a geração automática de configuração de teste para criar configurações adequadas de teste do TF.

Para configurar um gtest do lado 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 fornecem cobertura de código do seu projeto Java. Esses testes podem ser configurados para serem executados em um host de teste usando o executor HostTest.

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 de teste executa um teste JUnit do lado do host de HelloWorldHostTest. A configuração de teste acima pode ser gerada automaticamente. A menos que seu 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 adequada da TradeFed.

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

Testes isolados de host Java

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

  • Este é o executor padrão usado para testes de unidade do Robolectric e do JUnit.
  • O Tradefed só é compatível com testes JUnit no ambiente de isolamento.
  • Somente dependências vinculadas de forma estática são compatíveis. Nenhuma dependência declarada com lib é incluída no classpath.
  • O executor de isolamento só coloca o executor de shim e o JAR de teste no classpath.
  • Há uma quantidade fixa de sobrecarga por execução de teste com esse executor.

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

<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 geração automática

Em vez de criar manualmente a configuração de teste 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 isolado, 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 para o subprocesso, além de adicionar o build de árvore do android-all ao classpath do subprocesso. Embora as outras duas sejam práticas recomendadas, essa opção é obrigatória para executar testes do 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 subprocessos 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 gerar 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 em 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 TF PythonBinaryHostTest.

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 TF acesse o teste do lado do host em um determinado build, defina a configuração do módulo de teste `test_suites` como `general-tests`:

test_suites: ["general-tests"],

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