Berichte zur Codeabdeckung ansehen (mit On-Device-Agent)

Das Android Gradle-Plug-in (AGP) kann mit einem On-Device-Coverage-Agenten Berichte zur Codeabdeckung für Ihre Instrumentierungstests erstellen. Standardmäßig instrumentiert das AGP die Klassen Ihrer App mit JaCoCo, wenn es Ihre App erstellt. Das bedeutet, dass Code hinzugefügt wird, der aufzeichnet, welche Teile Ihrer App von Ihren Tests ausgeführt werden. Mit dem On-Device-Coverage-Agent erstellt das AGP Ihre App ohne diesen zusätzlichen Code und der Agent instrumentiert die Klassen Ihrer App auf dem Testgerät, während Ihre Tests ausgeführt werden. Auf dieser Seite wird beschrieben, wie Sie die Codeabdeckung auf dem Gerät aktivieren und Berichte erstellen.

Im Vergleich zur Codeabdeckung während des Builds bietet die Codeabdeckung auf dem Gerät die folgenden Vorteile:

  • Schnellere Builds: Das AGP führt den JaCoCo-Instrumentierungsschritt nicht für die Klassen Ihrer App und deren Abhängigkeiten aus. Dadurch können die Build-Zeiten um 10–20 % verkürzt werden.
  • Kleinere Debug-APKs: Das AGP fügt den Klassen Ihrer App keinen Code zur Abdeckungsverfolgung hinzu. Dadurch kann Ihr Debug-APK um 20–25% kleiner werden.
  • Keine ungenutzten generierten Klassen in Berichten: Generierte Klassen, die nicht von Ihren Tests verwendet werden, verringern nicht die Abdeckungswerte.

Die tatsächlichen Verbesserungen bei der Build-Dauer und der APK-Größe hängen von Ihrem Projekt ab.

Vorbereitung

Damit Sie die Codeabdeckung auf dem Gerät verwenden können, müssen Ihr Projekt und Ihre Testgeräte die folgenden Anforderungen erfüllen:

  • AGP 9.6.0-alpha01 oder höher.
  • Ein Gerät oder Emulator mit Android 9 (API-Level 28) oder höher.
  • Ein Build-Typ mit Debugging-Funktion für die Variante, die Sie testen, z. B. der Standard-Build-Typ debug. Der Agent kann nur an debugfähige Anwendungen angehängt werden.
  • Instrumentierte Tests, die mit AndroidJUnitRunner oder einem benutzerdefinierten Test-Runner ausgeführt werden, der diese erweitert.

Codeabdeckung auf dem Gerät aktivieren

Für die Codeabdeckung auf dem Gerät wird dasselbe enableAndroidTestCoverage-Attribut wie für die Codeabdeckung während des Builds verwendet. Setzen Sie enableAndroidTestCoverage in den Build-Dateien auf Modulebene für jede Variante, für die Sie Abdeckungsberichte erhalten möchten, auf true:

Kotlin

android {
    // ...
    buildTypes {
        debug {
            // Enable coverage for instrumentation tests
            enableAndroidTestCoverage = true
        }
    }
}

Groovy

android {
    // ...
    buildTypes {
        debug {
            // Enable coverage for instrumentation tests
            enableAndroidTestCoverage true
        }
    }
}

Aktivieren Sie dann den On-Device-Coverage-Agent und die Berichtsaggregation in der Datei gradle.properties Ihres Projekts:

android.experimental.androidTest.coverage.useOnDeviceAgent=true
android.experimental.reportAggregationSupport=true

Die Codeabdeckung auf dem Gerät generiert ihren HTML-Bericht mit demselben Renderer wie einheitliche Codeabdeckungsberichte. Daher sind beide Properties erforderlich.

Berichte zur Codeabdeckung auf dem Gerät erstellen

Wenn Sie Instrumentierungstests ausführen und Berichte zur Abdeckung generieren möchten, verbinden Sie ein Gerät oder starten Sie einen Emulator und führen Sie dann die folgende Aufgabe aus:

Abdeckungsumfang Befehl Ort melden
Eine Variante ./gradlew :module-name:createVariantNameAndroidTestCoverageReport path-to-your-project/module-name/build/reports/coverage/androidTest/variant/connected/index.html

Unterschiede zur Codeabdeckung während des Builds

Berichte zur Abdeckung auf dem Gerät und zur Build-Zeit können für dieselben Tests unterschiedliche Ergebnisse liefern. Beachten Sie die folgenden Unterschiede, wenn Sie die beiden Berichte vergleichen oder Abdeckungsgrenzwerte von einem Bericht in den anderen verschieben:

Region Codeabdeckung während der Build-Zeit Codeabdeckung auf dem Gerät
Wann Klassen instrumentiert werden Wenn das AGP Ihre App mit JaCoCo erstellt, Auf dem Testgerät, während die Tests ausgeführt werden, mithilfe des Coverage-Agents
Klassen im Bericht Alle Klassen in Ihrem Modul Nur die Klassen im Namespace Ihres Moduls, die während der Ausführung Ihrer Tests geladen werden, sodass die Abdeckungsprozentsätze höher sein können
Anzahl der Anweisungen Java-Bytecode-Anweisungen DEX-Bytecode-Anweisungen
Anzahl der Zweige Verzweigungen im Java-Bytecode Verzweigungen im DEX-Bytecode. D8 kann Bedingungen in verschiedene Verzweigungen kompilieren und jedes Tool lässt andere vom Compiler generierte Verzweigungen aus, sodass die Anzahl variieren kann.
Zähler Anweisungen, Verzweigungen, Zeilen, Komplexität, Methoden und Klassen Anweisungen, Verzweigungen, Zeilen, Methoden und Klassen. Komplexitätszähler werden noch nicht unterstützt.
Testgeräte Alle API-Level, die von Ihrer App unterstützt werden Android 9 (API-Level 28) und höher
Rohdaten zur Abdeckung .ec Dateien coverage_metadata.pb- und coverage_hits.pb-Dateien

Wenn Sie zur Codeabdeckung während der Build-Erstellung zurückkehren möchten, legen Sie android.experimental.androidTest.coverage.useOnDeviceAgent=false fest oder entfernen Sie das Attribut. Sie müssen weder Ihre Build-Dateien noch die von Ihnen ausgeführten Aufgaben ändern.

Bekannte Probleme

Für die Codeabdeckung auf dem Gerät gelten die folgenden bekannten Probleme:

  • Nicht geladene Klassen:Klassen, die während der Tests nie geladen werden, werden nicht im Bericht aufgeführt. In Berichten zur Codeabdeckung während der Build-Zeit werden sie mit 0% Abdeckung aufgeführt.
  • Aggregierte Berichte:Wenn Ihr Projekt auch die Abdeckung von Hosttests wie Unit-Tests erfasst, kombiniert der aggregierte Abdeckungsbericht, der von den Tasks testAllSuites und testAllSuitesWithDependencies erstellt wird, die Java-Bytecode-Anzahl aus diesen Tests mit der DEX-Bytecode-Anzahl aus dem Agent. Aufgrund der Unterschiede zwischen den beiden können die aggregierten Anweisungs- und Verzweigungszahlen von den Zahlen in den Berichten zur Codeabdeckung bei der Build-Erstellung abweichen.

Sonstiges Feedback und Probleme können Sie über den Issue Tracker melden.