Instrumentierungstests

Lesen Sie zunächst Testen Sie Ihre App auf Developer.android.com. Beachten Sie, dass es einige Unterschiede bei der Verwendung von Instrumentierungstests beim Plattformtest gibt.

Zusammenfassend stellt ein Instrumentierungstest eine spezielle Testausführungsumgebung bereit, die über den Befehl am instrument gestartet wird, in der der Zielanwendungsprozess neu gestartet und mit dem grundlegenden Anwendungskontext initialisiert wird und ein Instrumentierungsthread innerhalb der VM des Anwendungsprozesses gestartet wird. Ihr Testcode beginnt mit der Ausführung in diesem Instrumentierungsthread und wird mit einer Instrumentation bereitgestellt, die Zugriff auf den Anwendungskontext und APIs bietet, um den zu testenden Anwendungsprozess zu manipulieren.

Schlüssel Konzepte

  • Eine Instrumentierung muss in einem Anwendungspaket deklariert werden, wobei ein <instrumentation> -Tag unter dem <manifest> -Tag des Anwendungspaketmanifests verschachtelt ist.
  • Ein Anwendungspaketmanifest kann technisch gesehen mehrere <instrumentation> -Tags enthalten, wird jedoch normalerweise nicht auf diese Weise verwendet.
  • Jede <instrumentation> muss Folgendes enthalten:
    • ein android:name Attribut: Es sollte der Name einer Unterklasse der Instrumentation sein, die in der Testanwendung enthalten ist, bei der es sich normalerweise um den verwendeten Testläufer handelt, z. B.: android.support.test.runner.AndroidJUnitRunner
    • Es muss ein android:targetPackage Attribut definiert werden. Sein Wert sollte auf das zu testende Anwendungspaket festgelegt werden.

Zusammenfassung der Schritte

  1. Nachfolgend finden Sie gängige Ziele für hermetische Tests gegen Framework-Dienste:

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

    Wenn Sie ein brandneues Instrumentierungsmodul für Ihre Komponente hinzufügen, lesen Sie

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

  3. Ein Beispiel finden Sie unter „frameworks/base/core/tests/coretests/“ . Beachten Sie, dass diese Zeilen zusätzliche Apps installieren:

    <option name="test-file-name" value="FrameworksCoreTests.apk" />
    <option name="test-file-name" value="BstatsTestApp.apk" />
    
  4. Vergessen Sie nicht, Ihren Test als @SmallTest , @MediumTest oder @LargeTest zu markieren

  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 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 unter 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 unter 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 mithilfe von JUnit APIs eine explizite Aussage darüber treffen, ob er bestanden oder nicht bestanden wurde. Darüber hinaus führen alle nicht abgefangenen Ausnahmen ebenfalls zu einem Funktionsfehler.

Um Leistungsmetriken auszugeben, kann Ihr Testcode Instrumentation#sendStatus aufrufen, um eine Liste von Schlüssel-Wert-Paaren zu senden. Es ist wichtig zu beachten:

  1. Metriken können Ganzzahl- oder Gleitkommazahlen sein
  2. Alle nicht numerischen Werte werden verworfen
  3. Bei Ihrer Test-Apk kann es sich entweder um Funktionstests oder um Metriktests handeln. Das Mischen beider Tests wird derzeit jedoch nicht unterstützt