Test di strumentazione

Innanzitutto, leggi l'articolo Testare l'app su developer.android.com. Tieni presente che esistono alcune differenze nel modo in cui i test di misurazione vengono utilizzati nei test della piattaforma.

In sintesi, un test di misurazione 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 viene avviato un thread di misurazione all'interno della VM del processo dell'applicazione. Il codice di test avvia l'esecuzione su questo thread di misurazione e viene fornito con un'istanza Instrumentation che fornisce l'accesso al contesto dell'applicazione e alle API per manipolare il processo dell'applicazione in test.

Concetti principali

  • un'instrumentation deve essere dichiarata in un pacchetto dell'applicazione, con un <instrumentation> tag nidificato nel tag <manifest> del file manifest del pacchetto dell'applicazione.
  • tecnicamente un file manifest del pacchetto dell'applicazione può contenere più tag <instrumentation>, anche se non è comunemente utilizzato in questo modo.
  • 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 test runner in uso, ad esempio: android.support.test.runner.AndroidJUnitRunner
    • È necessario definire un attributo android:targetPackage. Il suo valore deve essere impostato sul pacchetto dell'applicazione sottoposto a test.

Riepilogo della procedura

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

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

    Se aggiungi un nuovo modulo di misurazione per il componente, consulta

  2. Segui la convenzione esistente se aggiungi test in una delle posizioni sopra indicate. Se stai configurando un nuovo modulo di test, segui la procedura di 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:

    • La soluzione più semplice è utilizzare Atest nel seguente modo:

      atest FrameworksCoreTests
      
    • In alternativa, per test più complessi, utilizza il Trade Federation test Harness:

    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 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 di un determinato corso

        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ò fare un'affermazione esplicita su pass o fail utilizzando le API JUnit; inoltre, eventuali eccezioni non rilevate causeranno anche un errore funzionale.

Per emettere le 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 in formato intero o con virgola mobile
  2. eventuali valori non numerici verranno ignorati
  3. l'APK di test può essere costituito da test funzionali o di metriche, ma la combinazione di entrambi non è attualmente supportata