Instrumentierungstests

Lesen Sie zuerst den Artikel Test your app (App testen) auf developer.android.com. Beachten Sie, dass es einige Unterschiede bei der Verwendung von Instrumentierungstests in Plattformtests gibt.

Zusammenfassend lässt sich sagen, dass ein Instrumentierungstest eine spezielle Testausführungsumgebung bietet, die über den Befehl am instrument gestartet wird. Dabei wird der Zielanwendungsprozess neu gestartet und mit dem grundlegenden Anwendungskontext initialisiert. Außerdem wird ein Instrumentierungsthread in der VM des Anwendungsprozesses gestartet. Ihr Testcode wird in diesem Instrumentierungsthread ausgeführt und erhält eine Instrumentation-Instanz, die Zugriff auf den Anwendungskontext und APIs bietet, um den zu testenden Anwendungsprozess zu bearbeiten.

Wichtige Konzepte

  • Eine Instrumentierung muss in einem Anwendungspaket deklariert werden. Dazu verwenden Sie das <instrumentation> Tag, das unter dem <manifest> Tag des Manifests des Anwendungspakets verschachtelt ist.
  • Ein Manifest des Anwendungspakets kann technisch gesehen mehrere <instrumentation> Tags enthalten, wird aber normalerweise nicht auf diese Weise verwendet.
  • Jedes <instrumentation>-Tag 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 werden.

Zusammenfassung der Schritte

  1. Im Folgenden finden Sie häufige Ziele für hermetische Tests für Framework-Dienste:

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

    Wenn Sie ein neues Instrumentierungsmodul für Ihre Komponente hinzufügen, lesen Sie die folgenden Artikel:

  2. Halten Sie sich an die bestehende Konvention, wenn Sie Tests an einem der oben genannten Orte hinzufügen. Wenn Sie ein neues Testmodul einrichten, folgen Sie der Einrichtung von AndroidManifest.xml und Android.mk an einem der oben genannten Orte.

  3. Ein Beispiel finden Sie unter frameworks/base/core/tests/coretests/. Beachten Sie, dass mit diesen Zeilen zusätzliche Apps installiert werden:

    <option name="test-file-name" value="FrameworksCoreTests.apk" />
    <option name="test-file-name" value="BstatsTestApp.apk" />
    
  4. Vergessen Sie nicht, Ihren Test mit @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 die 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 einer bestimmten Klasse

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      4. Eine bestimmte Testmethode

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest#testCancel \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        

Ihr Test kann mit JUnit-APIs eine explizite Assertion für „Bestanden“ oder „Fehlgeschlagen“ ausgeben. Außerdem führen alle nicht abgefangenen Ausnahmen zu einem funktionalen Fehler.

Um Leistungsmesswerte auszugeben, 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. Alle nicht numerischen Werte werden verworfen.
  3. Ihre Test-APK kann entweder funktionale Tests oder Messwerttests enthalten. Eine Kombination aus beiden wird derzeit nicht unterstützt.