Instrumentierungstests

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

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 brandneues Instrumentierungsmodul für Ihre Komponente hinzufügen, lesen Sie

  2. 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 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 Sie die Tests manuell und führen Sie sie 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 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:

  1. Metriken können eine Ganzzahl oder eine Gleitkommazahl sein
  2. werden alle nicht numerischen Werte verworfen,
  3. Ihre Test-APK kann entweder Funktionstests oder Messwerttests enthalten. Eine Kombination aus beiden wird derzeit nicht unterstützt.