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 deandroid-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çõesSecurityException
.
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
.