Testes de instrumentação

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 fornece um ambiente especial de execução de teste lançado pelo comando am instrument, em que o processo do app 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 app. O código de teste inicia a execução nessa linha de execução 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.

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.
  • Tecnicamente, um manifesto de pacote de app pode conter várias tags <instrumentation>, embora não seja comumente usado dessa maneira.
  • cada <instrumentation> precisa conter:
    • um atributo android:name: ele precisa ser o nome de uma subclasse de Instrumentation 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.

Resumo das etapas

  1. 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

  2. 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 a configuração de AndroidManifest.xml e Android.mk em um dos locais acima.

  3. Consulte 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" />
    
  4. Não se esqueça de marcar o teste como @SmallTest, @MediumTest ou @LargeTest

  5. Crie 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 e execute os testes manualmente:

    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 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:

  1. as métricas podem ser números inteiros ou de ponto flutuante
  2. quaisquer valores não numéricos serão descartados
  3. O APK de teste pode ser de testes funcionais ou de métricas, mas não é possível misturar os dois no momento.