Lesen Sie zuerst den Artikel Testen Sie Ihre App 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
- Eine Instrumentierung muss in einem Anwendungspaket deklariert werden. Das Tag
<instrumentation>
muss dabei unter dem Tag<manifest>
des Manifests des Anwendungspakets verschachtelt sein. - Ein Manifest für ein Anwendungspaket kann technisch gesehen mehrere
<instrumentation>
-Tags enthalten, wird aber in der Regel nicht so verwendet. - Jedes
<instrumentation>
muss Folgendes enthalten:- ein
android:name
-Attribut: Es sollte der Name einer Unterklasse vonInstrumentation
sein, die in der Testanwendung enthalten ist. Das ist in der Regel der verwendete Test-Runner, z. B.: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 neues Instrumentierungsmodul für Ihre Komponente hinzufügen, lesen Sie den Hilfeartikel
Wenn Sie Tests an einer der oben genannten Stellen hinzufügen, sollten Sie der bestehenden Konvention folgen. 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 den Trade Federation Test Harness verwenden:
m tradefed-all tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
Wenn Sie Tradefed nicht verwenden, installieren und führen Sie die Tests manuell 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 Behauptung über Erfolg oder Misserfolg machen. Außerdem führen alle nicht abgefangenen 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 Folgendes:
- Messwerte können Ganzzahlen oder Gleitkommazahlen sein.
- Nicht numerische Werte werden verworfen.
- Ihre Test-APK kann entweder Funktionstests oder Messwerttests enthalten. Eine Kombination aus beiden wird derzeit nicht unterstützt.