Lesen Sie zuerst den Artikel App testen auf developer.android.com. Beachten Sie, dass es einige Unterschiede bei der Verwendung von Instrumentierungstests bei Plattformtests gibt.
Zusammenfassend bietet ein Instrumentierungstest eine spezielle Testausführungsumgebung, die über den Befehl am instrument
gestartet wird. Dabei wird der Zielanwendungsprozess neu gestartet und mit dem grundlegenden Anwendungskontext initialisiert. Außerdem wird ein Instrumentierungs-Thread in der VM des Anwendungsprozesses gestartet. Der Testcode wird in diesem Instrumentierungs-Thread ausgeführt und erhält eine Instrumentation
-Instanz, die Zugriff auf den Anwendungskontext und APIs zur Manipulation des zu testenden Anwendungsprozesses bietet.
Schlüsselkonzepte
- In einem Anwendungspaket muss eine Instrumentierung deklariert werden, wobei das Tag
<instrumentation>
unter dem Tag<manifest>
des Manifests des Anwendungspakets verschachtelt ist. - Ein Manifest für ein Anwendungspaket kann technisch gesehen mehrere
<instrumentation>
-Tags enthalten, wird aber in der Regel nicht so verwendet. - Jeder
<instrumentation>
muss Folgendes enthalten:- Ein
android:name
-Attribut: Dies sollte der Name einer abgeleiteten Klasse vonInstrumentation
sein, die in der Testanwendung enthalten ist.Dies ist in der Regel der verwendete Test-Runner. Beispiel:android.support.test.runner.AndroidJUnitRunner
- ein
android:targetPackage
-Attribut muss definiert sein. Der Wert sollte auf das zu testende Anwendungspaket festgelegt sein.
- Ein
Zusammenfassung der Schritte
Im Folgenden finden Sie häufige Ziele für hermetische Tests an Framework-Diensten:
frameworks/base/core/tests/coretests frameworks/base/services/tests/servicestests
Wenn Sie ein brandneues Instrumentierungsmodul für Ihre Komponente hinzufügen, lesen Sie
Halten Sie sich an die bestehende Konvention, wenn Sie an einem der oben genannten Orte Tests hinzufügen. Wenn Sie ein neues Testmodul einrichten, folgen Sie der Anleitung zur Einrichtung von
AndroidManifest.xml
undAndroid.mk
an einem der oben genannten Speicherorte.Ein Beispiel finden Sie unter frameworks/base/core/tests/coretests/. Mit diesen Zeilen werden zusätzliche Apps installiert:
<option name="test-file-name" value="FrameworksCoreTests.apk" /> <option name="test-file-name" value="BstatsTestApp.apk" />
Denken Sie daran, Ihren Test als
@SmallTest
,@MediumTest
oder@LargeTest
zu kennzeichnen.Erstellen Sie das Testmodul mit „m“, z.B.:
m FrameworksCoreTests
Führen Sie die Tests aus:
Die einfachste Lösung ist die Verwendung von Atest:
atest FrameworksCoreTests
Für komplexere Tests können Sie das Trade Federation-Test-Harness verwenden:
m tradefed-all tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
Wenn Sie Tradefed nicht verwenden, installieren Sie die Tests manuell und führen Sie sie aus:
- Installieren Sie das generierte APK:
adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
Führen Sie die Tests mit verschiedenen Optionen aus:
alle Tests in der APK
adb shell am instrument -w com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
alle Tests in einem bestimmten Java-Paket
adb shell am instrument -w -e package android.animation \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
alle Tests in einem bestimmten Kurs
adb shell am instrument -w -e class \ android.animation.AnimatorSetEventsTest \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
einer bestimmten Testmethode
adb shell am instrument -w -e class \ android.animation.AnimatorSetEventsTest#testCancel \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
Ihr Test kann mithilfe von JUnit
APIs eine explizite Assertion erstellen, wenn die Prüfung bestanden wird oder ein Fehler auftritt. Außerdem führen nicht abgefangene Ausnahmen zu einem Funktionsfehler.
Um Leistungsmesswerte zu senden, kann Ihr Testcode Instrumentation#sendStatus
aufrufen, um eine Liste von Schlüssel/Wert-Paaren zu senden. Beachten Sie dabei Folgendes:
- Metriken können eine Ganzzahl oder eine Gleitkommazahl sein
- werden alle nicht numerischen Werte verworfen,
- Ihre Test-APK kann entweder Funktionstests oder Messwerttests enthalten. Eine Kombination aus beiden wird derzeit nicht unterstützt.