Primeiro leia Teste seu aplicativo em developer.android.com. Observe que existem algumas diferenças em como os testes de instrumentação são usados nos testes de plataforma.
Em resumo, um teste de instrumentação fornece um ambiente especial de execução de teste iniciado por meio do comando am instrument
, onde o processo de aplicação alvo é reiniciado e inicializado com o contexto básico da aplicação, e um thread de instrumentação é iniciado dentro da VM do processo de aplicação. Seu código de teste inicia a execução nesse thread de instrumentação e é fornecido com uma instância Instrumentation
que fornece acesso ao contexto do aplicativo e às APIs para manipular o processo do aplicativo em teste.
Conceitos chave
- uma instrumentação deve ser declarada em um pacote de aplicação, com uma tag
<instrumentation>
aninhada sob a tag<manifest>
do manifesto do pacote de aplicação. - um manifesto de pacote de aplicativo pode tecnicamente conter várias tags
<instrumentation>
, embora não seja comumente usado dessa forma. - cada
<instrumentation>
deve conter:- um atributo
android:name
: deve ser o nome de uma subclasse deInstrumentation
incluída no aplicativo de teste, que normalmente é o executor de teste que está sendo usado, por exemplo:android.support.test.runner.AndroidJUnitRunner
- um atributo
android:targetPackage
deve ser definido. Seu valor deve ser definido para o pacote de aplicativos em teste.
- um atributo
Resumo das etapas
Abaixo estão destinos comuns para testes herméticos em serviços de estrutura:
frameworks/base/core/tests/coretests frameworks/base/services/tests/servicestests
Se você estiver adicionando um novo módulo de instrumentação ao seu componente, consulte
Seguindo a convenção existente 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 acimaVeja frameworks/base/core/tests/coretests/ para obter um exemplo. Observe que estas linhas instalam aplicativos 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
Construa o módulo de teste com m, por exemplo:
m FrameworksCoreTests
Execute os testes:
A solução mais simples é usar o Atest assim:
atest FrameworksCoreTests
Ou para testes mais complexos, use o equipamento de teste da Federação de Comércio :
m tradefed-all tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
Se não estiver usando o Tradefed, instale manualmente e execute os testes:
- 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
Seu teste pode fazer uma afirmação explícita sobre aprovação ou reprovação usando APIs JUnit
; além disso, quaisquer exceções não detectadas também causarão uma falha funcional.
Para emitir métricas de desempenho, seu código de teste pode chamar Instrumentation#sendStatus
para enviar uma lista de pares de valores-chave. É importante observar que:
- as métricas podem ser inteiras ou de ponto flutuante
- quaisquer valores não numéricos serão descartados
- seu apk de teste pode ser testes funcionais ou testes de métricas, no entanto, a mistura de ambos não é suportada no momento