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
AndroidJUnitRunneroder 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
testAllSuitesundtestAllSuitesWithDependencieserstellt 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.