Escreva um teste sem dispositivo do lado do host em TF

Esta página explica como escrever um teste do lado do host que não requer um dispositivo, como um teste executado em uma instância Linux GCE. (Para obter detalhes sobre como escrever um teste orientado por host que requer um dispositivo, consulte Escrever um teste orientado por host na Trade Federation .)

Tipos de teste do lado do host

Você pode executar vários tipos de testes no host por meio da 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; o teste será executado muito mais rápido dessa forma. Para configurar esses testes para serem executados em um host de teste, use o executor TF HostGTest .

Este é um exemplo de configuração de teste 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 contar com a geração automática de configuração de teste para criar configurações de teste TF adequadas.

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 obter mais informações sobre como escrever um teste nativo, consulte Adicionando um novo exemplo de teste nativo .

Testes de host JAR

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 seu projeto Java. Esses testes podem ser configurados para execução em um host de teste usando o executor HostTest .

Exemplo de configuração de teste 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 . Observe que a configuração de teste acima pode ser gerada automaticamente. A menos que seu teste precise de configuração ou limpeza especial, conte com a geração automática de configuração de teste para criar a configuração de teste TradeFed adequada.

Para obter 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 de isolamento com um pequeno custo de desempenho. No entanto, existem algumas considerações importantes a serem feitas antes de escolher usar este ambiente.

  • Este é o executor padrão usado para testes de unidade Robolectric e JUnit
  • Tradefed oferece suporte apenas a testes JUnit no ambiente de isolamento.
  • Somente dependências vinculadas estaticamente são suportadas. Nenhuma dependência declarada com lib está incluída no classpath.
  • O executor de isolamento apenas coloca o executor shim e seu jar de teste no caminho de classe.
  • Há alguma sobrecarga fixa por execução de teste executada com este executor.

Exemplo de configuração de teste 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 geração automática

Em vez de criar manualmente a configuração de teste como acima , 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 Robolétricos

Os testes 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 passadas para o subprocesso, bem como adiciona a construção de árvore de android-all ao caminho de classe do subprocesso. Embora as outras duas sejam práticas recomendadas, esta opção é obrigatória para executar testes Robolectric com sucesso.
  • A opção java-folder permite alterar o tempo de execução Java usado pelo subprocesso. Isso é necessário porque a Robolectric prefere versões Java específicas que podem não estar alinhadas com a JVM preferida do sistema host.
  • A opção exclude-paths permite que o executor do 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 lançar exceções SecurityException .

Exemplo de configuração 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 Soong para geração automática Robolectric

Em vez de criar manualmente a configuração de teste como acima , 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 Python

Se a lógica de teste for escrita em Python, use o tipo de construção python_test_host para criar um arquivo par que pode ser executado por TF PythonBinaryHostTest .

Exemplo de configuração de teste 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 conjunto de testes

Para que o teste do lado do host seja acessível pelo TF para uma determinada compilação, defina a configuração `test_suites` do módulo de teste para `general-tests` :

test_suites: ["general-tests"],

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