Per prima cosa, leggi l'articolo Testare l'app su developer.android.com. Tieni presente che esistono 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 speciale del test avviato tramite il comando am instrument
, in cui il processo dell'applicazione di destinazione viene riavviato e inizializzato con il contesto di base dell'applicazione e viene avviato un thread di strumentazione all'interno della VM del processo dell'applicazione. Il codice di test inizia 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 in fase di test.
Concetti principali
- Un'instrumentazione deve essere dichiarata in un pacchetto dell'applicazione, con un tag
<instrumentation>
nidificato nel tag<manifest>
del file manifest del pacchetto dell'applicazione. - un file manifest del pacchetto dell'applicazione può tecnicamente 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 diInstrumentation
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 in fase di test.
- un attributo
Riepilogo dei passaggi
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
Segui la convenzione esistente se aggiungi test in una delle posizioni sopra indicate. Se stai configurando un nuovo modulo di test, segui la configurazione di
AndroidManifest.xml
eAndroid.mk
in una delle posizioni indicate sopra.Per un esempio, vedi 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" />
Non dimenticare di contrassegnare il test come
@SmallTest
,@MediumTest
o@LargeTest
Crea il modulo di test con m, ad esempio:
m FrameworksCoreTests
Esegui i test:
La soluzione più semplice è utilizzare Atest nel seguente modo:
atest FrameworksCoreTests
Per test più complessi, utilizza Trade Federation test Harness:
m tradefed-all tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
Se non utilizzi Tradefed, installa ed esegui manualmente i test:
- Installa l'APK generato:
adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
Esegui i test con varie opzioni:
tutti i test nell'APK
adb shell am instrument -w com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
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
tutti i test di una classe specifica
adb shell am instrument -w -e class \ android.animation.AnimatorSetEventsTest \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
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ò eseguire un'asserzione esplicita di superamento o errore utilizzando le API JUnit
; inoltre, qualsiasi eccezione non rilevata causerà 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:
- Le metriche possono essere numeri interi o in virgola mobile
- tutti i valori non numerici verranno eliminati
- L'APK di test può essere costituito da test funzionali o test delle metriche, ma la combinazione di entrambi non è attualmente supportata