Primeiro, leia Testar seu app em developer.android.com. Observe que há algumas diferenças na forma como os testes de instrumentação são usados nos testes de plataforma.
Em resumo, um teste de instrumentação oferece um ambiente de execução do teste especial, iniciado pelo comando am instrument, em que o processo do aplicativo de destino é reiniciado e inicializado com o contexto básico do aplicativo, e uma linha de execução de instrumentação é iniciada dentro da VM do processo do aplicativo. O código de teste começa a execução nessa linha de execução de instrumentação e recebe uma instância Instrumentation que fornece acesso ao contexto do aplicativo e às APIs para manipular o processo do aplicativo em teste.
Principais conceitos
- Uma instrumentação precisa ser declarada em um pacote de aplicativos, com uma
<instrumentation>tag aninhada na tag<manifest>do manifesto do pacote de aplicativos. - Um manifesto de pacote de aplicativos pode tecnicamente conter várias
<instrumentation>tags, embora não seja usado com frequência dessa forma. - Cada
<instrumentation>precisa conter:- Um atributo
android:name: precisa ser o nome de uma subclasse deInstrumentationincluída no aplicativo de teste, que normalmente é o executor de testes que está sendo usado, por exemplo:android.support.test.runner.AndroidJUnitRunner - Um atributo
android:targetPackageprecisa ser definido. O valor dele precisa ser definido como o pacote de aplicativos em teste.
- Um atributo
Resumo das etapas
Confira abaixo os destinos comuns para testes herméticos em serviços de framework:
frameworks/base/core/tests/coretests frameworks/base/services/tests/servicestestsSe você estiver adicionando um novo módulo de instrumentação para o componente, consulte
Siga a convenção atual se você estiver adicionando testes a um dos locais acima. Se você estiver configurando um novo módulo de teste, siga a configuração de
AndroidManifest.xmleAndroid.mkem um dos locais acima.Consulte frameworks/base/core/tests/coretests/ para ver um exemplo. Observe que essas linhas instalam apps extras:
<option name="test-file-name" value="FrameworksCoreTests.apk" /> <option name="test-file-name" value="BstatsTestApp.apk" />Não se esqueça de marcar o teste como
@SmallTest,@MediumTestou@LargeTest.Crie o módulo de teste com m, por exemplo:
m FrameworksCoreTestsExecute os testes:
A solução mais simples é usar o Atest desta forma:
atest FrameworksCoreTestsOu, para testes mais complexos, use o Harness de teste do Trade Federation:
m tradefed-all tradefed.sh run template/local_min --template:map test=FrameworksCoreTestsSe você não estiver usando o Tradefed, instale e execute os testes manualmente:
- Instale o APK gerado:
adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apkExecute os testes com várias opções:
todos os testes no APK
adb shell am instrument -w com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunnertodos os testes em um pacote Java específico
adb shell am instrument -w -e package android.animation \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunnertodos os testes em uma classe específica
adb shell am instrument -w -e class \ android.animation.AnimatorSetEventsTest \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunnerum método de teste específico
adb shell am instrument -w -e class \ android.animation.AnimatorSetEventsTest#testCancel \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
O teste pode fazer uma declaração explícita de aprovação ou falha usando as APIs JUnit. Além disso, todas as exceções não detectadas também causam uma falha funcional.
Para emitir métricas de performance, o código de teste pode chamar
Instrumentation#sendStatus
para enviar uma lista de pares de chave-valor. É importante observar que:
- as métricas podem ser números inteiros ou de ponto flutuante
- todos os valores não numéricos serão descartados
- o APK de teste pode ser de testes funcionais ou de métricas, mas a combinação dos dois não é compatível no momento