Escreva um teste sem dispositivo do lado do host em TF

Esta página informa como escrever um teste do lado do host que não exija um dispositivo, como um teste executado em uma instância Linux GCE. (Para obter detalhes sobre como escrever um teste controlado por host que requer um dispositivo, consulte Escrever um teste controlado por host na Federação de Comércio .)

Tipos de teste do lado do host

Você pode executar vários tipos de testes do lado do 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 maneira. 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 do 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 de 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 de 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 do 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 uma 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 esse ambiente.

  • Este é o executor padrão usado para testes de unidade Robolectric e JUnit
  • Tradefed suporta apenas 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 corredor de isolamento apenas coloca o corredor de correção e seu jar de teste no caminho de classe.
  • Há alguma quantidade de 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 Soong para geração automática

Em vez de criar manualmente a configuração de teste como acima , Soong pode autogerar 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 robolétricos usam o mesmo corredor que os 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, essa 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 o Robolectric prefere versões Java específicas que podem não se alinhar com a JVM preferencial 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 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 Soong para geração automática Robolectric

Em vez de criar manualmente a configuração de teste como acima , Soong pode autogerar 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 compilação python_test_host para criar um arquivo par que possa ser executado por TF PythonBinaryHostTest .

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

Para que o teste do lado do host seja acessível pelo TF para uma determinada compilação, 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 em general-tests.zip no destino test_suites .