Primeiro, leia Testar seu app. em developer.android.com. Há algumas diferenças como os testes de instrumentação são usados em testes de plataforma.
Em resumo, um teste de instrumentação oferece uma execução de teste especial
iniciado pelo comando am instrument
, em que o destino
processo do aplicativo é reiniciado e inicializado com um contexto básico de aplicativo,
e uma linha de execução de instrumentação é iniciada
dentro da VM do processo do aplicativo. Seu
código de teste começa a ser executado nessa linha de execução 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
<instrumentation>
aninhada na tag<manifest>
do manifesto do pacote do aplicativo. - um manifesto de pacote de aplicativo pode tecnicamente conter várias
<instrumentation>
, embora não sejam usadas com frequência dessa maneira. - cada
<instrumentation>
precisa conter:- Um atributo
android:name
: ele precisa ser o nome de uma subclasse deInstrumentation
incluído no aplicativo de teste, que normalmente é o arquivo runner que está sendo usado, por exemplo:android.support.test.runner.AndroidJUnitRunner
- um atributo
android:targetPackage
precisa ser definido. Seu valor deve 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 novo módulo de instrumentação para seu componente, consulte
Seguindo a convenção existente, se você estiver adicionando testes em uma das os locais acima. Se você estiver configurando um novo módulo de teste, siga as configuração de
AndroidManifest.xml
eAndroid.mk
em um dos locais acima deConsulte frameworks/base/core/tests/coretests/ (link em inglês) como 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 o 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:
atest FrameworksCoreTests
Para testes mais complexos, use o Acessório de testes da Trade Federation:
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
Seu teste pode fazer uma declaração explícita ao passar ou falhar usando APIs JUnit
. no
Além disso, todas as exceções não identificadas 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 chave-valor. É importante observar que:
- as métricas podem ser números inteiros ou pontos flutuantes
- quaisquer valores não numéricos serão descartados
- seu APK de teste pode ser tanto testes funcionais quanto testes de métricas. No entanto, não é possível misturar ambos