Instrumentierungstests

Lesen Sie zuerst Testen Sie Ihre App auf developer.android.com. Beachten Sie, dass es einige Unterschiede bei der Verwendung von Instrumentierungstests bei Plattformtests gibt.

Zusammenfassend stellt ein Instrumentierungstest eine spezielle Testausführungsumgebung bereit, wie sie über den Befehl am instrument gestartet wird, wo der Zielanwendungsprozess neu gestartet und mit grundlegendem Anwendungskontext initialisiert wird und ein Instrumentierungsthread innerhalb der Anwendungsprozess-VM gestartet wird. Ihr Testcode beginnt mit der Ausführung in diesem Instrumentierungsthread und wird mit einer Instrumentation bereitgestellt, die Zugriff auf den Anwendungskontext und die 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, obwohl es normalerweise nicht auf diese Weise verwendet wird.
  • jede <instrumentation> muss enthalten:
    • ein android:name -Attribut: Es sollte der Name einer Unterklasse von Instrumentation sein, die in der Testanwendung enthalten ist, was normalerweise der verwendete Test Runner ist, z. B.: android.support.test.runner.AndroidJUnitRunner
    • ein android:targetPackage Attribut muss definiert werden. Sein Wert sollte auf das zu testende Anwendungspaket festgelegt werden.

Zusammenfassung der Schritte

  1. Unten sind gängige Ziele für hermetische Tests gegen Framework-Dienste aufgeführt:

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

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

  2. Befolgen Sie die bestehende Konvention, wenn Sie Tests an einem der oben genannten Speicherorte hinzufügen. Wenn Sie ein neues Testmodul einrichten, folgen Sie bitte 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 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. Bauen Sie das Testmodul mit m, zB:

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

    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 durch:

      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. ein bestimmtes Prüfverfahren

        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 zum Bestehen oder Nichtbestehen machen; Darüber hinaus verursachen alle nicht abgefangenen Ausnahmen ebenfalls einen Funktionsausfall.

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

  1. Metriken können Ganzzahlen oder Fließkommazahlen sein
  2. Alle nicht numerischen Werte werden verworfen
  3. Ihre Test-APK kann entweder ein Funktionstest oder ein Metriktest sein, jedoch wird das Mischen beider derzeit nicht unterstützt