Instrumentierungstests

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 von Instrumentation 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.

Zusammenfassung der Schritte

  1. 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

  2. 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 und Android.mk an einem der oben genannten Speicherorte.

  3. 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" />
    
  4. Denken Sie daran, Ihren Test als @SmallTest, @MediumTest oder @LargeTest zu kennzeichnen.

  5. Erstellen Sie das Testmodul mit „m“, z.B.:

    m FrameworksCoreTests
    
  6. Führen Sie die Tests aus:

    m tradefed-all
    tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
    
  7. Wenn Sie Tradefed nicht verwenden, installieren und führen Sie die Tests manuell aus:

    1. Installieren Sie das generierte APK:
    adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
    
    1. Führen Sie die Tests mit verschiedenen Optionen aus:

      1. alle Tests in der APK

        adb shell am instrument -w com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      2. 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
        
      3. 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
        
      4. 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:

  1. Messwerte können Ganzzahlen oder Gleitkommazahlen sein.
  2. Nicht numerische Werte werden verworfen.
  3. Ihre Test-APK kann entweder Funktionstests oder Messwerttests enthalten. Eine Kombination aus beiden wird derzeit nicht unterstützt.