Prove di strumentazione

Prima lettura Testa la tua app su developer.android.com. Prendi nota che ci sono alcune differenze nel modo in cui i test di strumentazione vengono utilizzati nei test della piattaforma.

In sintesi, un test di strumentazione fornisce uno speciale ambiente di esecuzione del test avviato tramite il comando am instrument , in cui il processo dell'applicazione di destinazione viene riavviato e inizializzato con il contesto dell'applicazione di base e un thread di strumentazione viene avviato all'interno della macchina virtuale del processo dell'applicazione. Il tuo codice di test avvia l'esecuzione su questo thread di strumentazione e viene fornito con un'istanza Instrumentation che fornisce l'accesso al contesto dell'applicazione e alle API per manipolare il processo dell'applicazione sottoposto a test.

Concetti chiave

  • una strumentazione deve essere dichiarata in un pacchetto dell'applicazione, con un tag <instrumentation> annidato sotto il tag <manifest> del manifesto del pacchetto dell'applicazione.
  • un manifesto del pacchetto dell'applicazione può tecnicamente contenere più tag <instrumentation> , sebbene non sia comunemente usato in questo modo.
  • ogni <instrumentation> deve contenere:
    • un attributo android:name : dovrebbe essere il nome di una sottoclasse di Instrumentation inclusa nell'applicazione di test, che in genere è il test runner utilizzato, ad esempio: android.support.test.runner.AndroidJUnitRunner
    • deve essere definito un attributo android:targetPackage . Il suo valore deve essere impostato sul pacchetto dell'applicazione sottoposto a test.

Sintesi dei passaggi

  1. Di seguito sono riportate le destinazioni comuni per i test ermetici rispetto ai servizi framework:

    frameworks/base/core/tests/coretests
    frameworks/base/services/tests/servicestests
    

    Se stai aggiungendo un nuovo modulo di strumentazione per il tuo componente, vedi

  2. Seguendo la convenzione esistente se si aggiungono test in una delle posizioni di cui sopra. Se stai configurando un nuovo modulo di test, segui la configurazione di AndroidManifest.xml e Android.mk in una delle posizioni sopra

  3. Vedere frameworks/base/core/tests/coretests/ per un esempio. Nota che queste righe installano app extra:

    <option name="test-file-name" value="FrameworksCoreTests.apk" />
    <option name="test-file-name" value="BstatsTestApp.apk" />
    
  4. Non dimenticare di contrassegnare il tuo test come @SmallTest , @MediumTest o @LargeTest

  5. Costruisci il modulo di test con m, ad esempio:

    m FrameworksCoreTests
    
  6. Esegui i test:

    m tradefed-all
    tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
    
  7. Se non utilizzi Tradefed, installa manualmente ed esegui i test:

    1. Installa l'apk generato:
    adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
    
    1. Eseguire i test con varie opzioni:

      1. tutti i test nell'apk

        adb shell am instrument -w com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      2. tutti i test in uno specifico pacchetto Java

        adb shell am instrument -w -e package android.animation \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      3. tutti i test in una classe specifica

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      4. uno specifico metodo di prova

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest#testCancel \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        

Il tuo test può fare un'asserzione esplicita in caso di superamento o fallimento utilizzando le API JUnit ; inoltre, anche eventuali eccezioni non rilevate causeranno un errore funzionale.

Per emettere metriche sulle prestazioni, il codice di test può chiamare Instrumentation#sendStatus per inviare un elenco di coppie chiave-valore. È importante notare che:

  1. le metriche possono essere intere o in virgola mobile
  2. eventuali valori non numerici verranno scartati
  3. il tuo apk di test può essere test funzionali o test di metrica, tuttavia la combinazione di entrambi non è attualmente supportata