Primeiro, leia Teste seu app em developer.android.com. Observe que há algumas diferenças em como os testes de instrumentação são usados em testes de plataforma.
Em resumo, um teste de instrumentação fornece um ambiente especial de execução de teste, iniciado com o comando am instrument
. Nele, 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 na VM do processo do aplicativo. O
código de teste começa a execução nessa linha de instrumentação e recebe
uma instância Instrumentation
que fornece acesso ao contexto do aplicativo
e APIs para manipular o processo do aplicativo em teste.
Principais conceitos
- Uma instrumentação precisa ser declarada em um pacote de aplicativo, com uma
tag
<instrumentation>
aninhada na tag<manifest>
do manifesto do pacote de aplicativo. - Um manifesto de pacote de aplicativo pode tecnicamente conter várias tags
<instrumentation>
, embora não seja comumente usado dessa forma. - Cada
<instrumentation>
precisa conter:- um atributo
android:name
: ele precisa ser o nome de uma subclasse deInstrumentation
incluída no app de teste, que geralmente é o executor de teste usado. Por exemplo:android.support.test.runner.AndroidJUnitRunner
- um atributo
android:targetPackage
precisa ser definido. O valor precisa ser definido como o pacote do aplicativo em teste.
- um atributo
Resumo das etapas
Confira abaixo destinos comuns para testes herméticos em serviços de framework:
frameworks/base/core/tests/coretests frameworks/base/services/tests/servicestests
Se você estiver adicionando um módulo de instrumentação totalmente novo para seu componente, consulte
Seguindo a convenção atual, se você estiver adicionando testes em um dos locais acima. Se você estiver configurando um novo módulo de teste, siga a configuração de
AndroidManifest.xml
eAndroid.mk
em 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 seu teste como
@SmallTest
,@MediumTest
ou@LargeTest
.Crie o módulo de teste com m. Por exemplo:
m FrameworksCoreTests
Execute os testes:
A solução mais simples é usar Atest desta forma:
atest FrameworksCoreTests
Ou, para testes mais complexos, use o Trade Federation test Harness:
m tradefed-all tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
Se não estiver usando o Tradefed, instale e execute os testes manualmente:
- Instale o APK gerado:
adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
Execute 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.AndroidJUnitRunner
todos 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.AndroidJUnitRunner
todos 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.AndroidJUnitRunner
um 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, exceções não capturadas também causam uma falha funcional.
Para emitir métricas de performance, seu 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
- Seu APK de teste pode ser de testes funcionais ou de métricas, mas a combinação dos dois não é compatível no momento.