Testes de instrumentação

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 de execução de teste especial, conforme iniciado por meio do comando am instrument , em que o processo do aplicativo de destino é reiniciado e inicializado com o contexto básico do aplicativo e um thread de instrumentação é iniciado dentro da VM do processo do aplicativo. Seu código de teste inicia a execução neste encadeamento de instrumentação e é fornecido com uma instância de Instrumentation que fornece acesso ao contexto do aplicativo e APIs para manipular o processo do aplicativo em teste.

Conceitos chave

  • uma instrumentação deve ser declarada em um pacote de aplicativos, com uma tag <instrumentation> aninhada sob a tag <manifest> do manifesto do pacote de aplicativos.
  • um manifesto de pacote de aplicativo tecnicamente pode conter várias tags <instrumentation> , embora não seja comumente usado dessa maneira.
  • cada <instrumentation> deve conter:
    • um atributo android:name : deve ser o nome de uma subclasse de Instrumentation que está 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.

Resumo das etapas

  1. Abaixo estão os destinos comuns para testes herméticos contra 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 para seu componente, consulte

  2. 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 e Android.mk em um dos locais acima

  3. Veja frameworks/base/core/tests/coretests/ para 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" />
    
  4. Não se esqueça de marcar seu teste como @SmallTest , @MediumTest ou @LargeTest

  5. Construa o módulo de teste com m, por exemplo:

    m FrameworksCoreTests
    
  6. Execute os testes:

    m tradefed-all
    tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
    
  7. Se não estiver usando o Tradefed, instale manualmente e execute os testes:

    1. Instale o apk gerado:
    adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
    
    1. Execute os testes com várias opções:

      1. todos os testes no apk

        adb shell am instrument -w com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      2. 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
        
      3. 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
        
      4. 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 de aprovação ou reprovação usando APIs JUnit ; além disso, quaisquer exceções não capturadas 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 notar que:

  1. as métricas podem ser inteiras ou de ponto flutuante
  2. quaisquer valores não numéricos serão descartados
  3. seu apk de teste pode ser testes funcionais ou testes de métricas, no entanto, a mistura de ambos não é suportada no momento