Test di strumentazione

Per prima cosa, leggi Testare l'app su developer.android.com. Tieni presente che ci sono alcune differenze nel modo in cui vengono utilizzati i test di strumentazione nei test della piattaforma.

In sintesi, un test di strumentazione fornisce un ambiente di esecuzione dei test speciale 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 VM del processo dell'applicazione. Il codice di test inizia l'esecuzione su questo thread di strumentazione e viene fornita un'istanza Instrumentation che fornisce l'accesso al contesto dell'applicazione e alle API per manipolare il processo dell'applicazione in fase di test.

Concetti fondamentali

  • Una strumentazione deve essere dichiarata in un pacchetto dell'applicazione, con un <instrumentation> tag nidificato sotto il tag <manifest> del file manifest del pacchetto dell'applicazione.
  • Tecnicamente, un file manifest del pacchetto dell'applicazione può contenere più <instrumentation> tag, anche se non è di uso comune.
  • Ogni <instrumentation> deve contenere:
    • un attributo android:name: deve essere il nome di una sottoclasse di Instrumentation inclusa nell'applicazione di test, che in genere è il runner di test in uso, ad es.: android.support.test.runner.AndroidJUnitRunner
    • È necessario definire un attributo android:targetPackage. Il valore deve essere impostato sul pacchetto dell'applicazione in fase di test.

Riepilogo dei passaggi

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

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

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

  2. Segui la convenzione esistente se stai aggiungendo test in una delle posizioni sopra indicate. Se stai configurando un nuovo modulo di test, segui la configurazione di AndroidManifest.xml e Android.mk in una delle posizioni sopra indicate.

  3. Per un esempio, consulta frameworks/base/core/tests/coretests/. Tieni presente che queste righe installano app aggiuntive:

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

  5. Crea il modulo di test con m, ad es.:

    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 ed esegui manualmente i test:

    1. Installa l'APK generato:
    adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
    
    1. Esegui 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 un pacchetto Java specifico

        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. Un metodo di test specifico

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

Il test può effettuare un'asserzione esplicita su superamento o errore utilizzando le API JUnit. Inoltre, eventuali eccezioni non rilevate causeranno anche un errore funzionale.

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

  1. Le metriche possono essere numeri interi o in virgola mobile.
  2. Tutti i valori non numerici verranno ignorati.
  3. L'APK di test può contenere test funzionali o test delle metriche, ma al momento non è supportata la combinazione di entrambi.