Wtyczka Androida do obsługi Gradle (AGP) może tworzyć raporty o pokryciu kodu na potrzeby testów z instrumentacją za pomocą agenta pokrycia na urządzeniu. Domyślnie AGP instrumentuje klasy aplikacji za pomocą JaCoCo podczas jej kompilowania, co oznacza, że dodaje kod, który rejestruje, które części aplikacji są uruchamiane przez testy. Dzięki agentowi pokrycia na urządzeniu wtyczka Androida do obsługi Gradle kompiluje aplikację bez tego dodatkowego kodu, a agent instrumentuje klasy aplikacji na urządzeniu testowym podczas przeprowadzania testów. Na tej stronie dowiesz się, jak włączyć pokrycie kodu na urządzeniu i generować raporty.
W porównaniu z pokryciem kodu w czasie kompilacji pokrycie kodu na urządzeniu ma te zalety:
- Szybsze kompilacje: AGP nie uruchamia kroku instrumentacji JaCoCo w klasach aplikacji i ich zależnościach, co może skrócić czas kompilacji o 10–20%.
- Mniejsze pliki APK do debugowania: AGP nie dodaje kodu śledzenia zasięgu do klas aplikacji, co może zmniejszyć rozmiar pliku APK do debugowania o 20–25%.
- Brak nieużywanych wygenerowanych klas w raportach: wygenerowane klasy, których nie używają testy, nie obniżają wyników pokrycia.
Rzeczywisty czas kompilacji i rozmiar pakietu APK zależą od projektu.
Wymagania wstępne
Aby korzystać z pokrycia kodu na urządzeniu, upewnij się, że projekt i urządzenia testowe spełniają te wymagania:
- AGP w wersji 9.6.0-alpha01 lub nowszej.
- urządzenie lub emulator z Androidem 9 (poziom API 28) lub nowszym;
- Typ kompilacji z możliwością debugowania dla testowanego wariantu, np. domyślny typ kompilacji
debug. Agenta można dołączyć tylko do aplikacji z możliwością debugowania. - Testy instrumentowane, które są uruchamiane za pomocą
AndroidJUnitRunnerlub niestandardowego modułu uruchamiającego testy, który rozszerza tę klasę.
Włączanie pokrycia kodu na urządzeniu
Pokrycie kodu na urządzeniu używa tej samej właściwości enableAndroidTestCoverage co pokrycie kodu w czasie kompilacji. W plikach kompilacji na poziomie modułu ustaw wartość enableAndroidTestCoverage na true dla każdego wariantu, dla którego chcesz otrzymywać raporty o pokryciu:
Kotlin
android {
// ...
buildTypes {
debug {
// Enable coverage for instrumentation tests
enableAndroidTestCoverage = true
}
}
}
Dynamiczny
android {
// ...
buildTypes {
debug {
// Enable coverage for instrumentation tests
enableAndroidTestCoverage true
}
}
}
Następnie włącz agenta pokrycia na urządzeniu i agregację raportów w pliku gradle.properties projektu:
android.experimental.androidTest.coverage.useOnDeviceAgent=true
android.experimental.reportAggregationSupport=true
Pokrycie kodu na urządzeniu generuje raport HTML za pomocą tego samego mechanizmu renderowania co ujednolicone raporty o pokryciu kodu, więc wymaga obu właściwości.
Generowanie raportów o pokryciu kodu na urządzeniu
Aby przeprowadzić testy z instrumentacją i wygenerować raporty o pokryciu, podłącz urządzenie lub uruchom emulator, a następnie wykonaj to zadanie:
| Zakres ochrony | Polecenie | Lokalizacja raportu |
|---|---|---|
| 1 wariant, | ./gradlew :module-name:createVariantNameAndroidTestCoverageReport |
path-to-your-project/module-name/build/reports/coverage/androidTest/variant/connected/index.html |
Różnice w porównaniu z pokryciem kodu w czasie kompilacji
Raporty o pokryciu na urządzeniu i w czasie kompilacji mogą pokazywać różne wyniki tych samych testów. Podczas porównywania tych 2 raportów lub przenoszenia progów pokrycia z jednego do drugiego pamiętaj o tych różnicach:
| Obszar | Pokrycie kodu w czasie kompilacji | Pokrycie kodu na urządzeniu |
|---|---|---|
| Kiedy klasy są instrumentowane | gdy AGP tworzy aplikację przy użyciu JaCoCo; | na urządzeniu testowym podczas testów, za pomocą agenta pokrycia; |
| Zajęcia w raporcie | Wszystkie zajęcia w module | tylko klasy w przestrzeni nazw modułu, które są wczytywane podczas testów, dzięki czemu odsetek pokrycia może być wyższy; |
| Liczba instrukcji | Instrukcje kodu bajtowego Javy | Instrukcje kodu bajtowego DEX |
| Liczba gałęzi | Gałęzie w kodzie bajtowym Javy | Gałęzie w kodzie bajtowym DEX. D8 może kompilować warunki w różne gałęzie, a każde narzędzie pomija inne gałęzie wygenerowane przez kompilator, więc liczby mogą się różnić. |
| Liczniki | Instrukcje, gałęzie, wiersze, złożoność, metody i klasy | Instrukcje, gałęzie, wiersze, metody i klasy. Liczniki złożoności nie są jeszcze obsługiwane. |
| Urządzenia testowe | wszystkie poziomy interfejsu API obsługiwane przez aplikację; | Android 9 (poziom 28 interfejsu API) lub nowszy |
| Nieprzetworzone dane o pokryciu | Pliki: .ec |
coverage_metadata.pb i jeszcze coverage_hits.pb plik |
Aby wrócić do pokrycia kodu w czasie kompilacji, ustaw android.experimental.androidTest.coverage.useOnDeviceAgent=false lub usuń właściwość. Nie musisz zmieniać plików kompilacji ani uruchamianych zadań.
Znane problemy
Znane problemy z pokryciem kodu na urządzeniu:
- Zajęcia, które się nie wczytują: zajęcia, które nigdy nie wczytują się podczas testów, nie pojawiają się w raporcie. Raporty o pokryciu kodu w czasie kompilacji zawierają je z pokryciem 0%.
- Raporty zbiorcze: jeśli Twój projekt zbiera też dane o pokryciu z testów hosta, takich jak testy jednostkowe, zbiorczy raport o pokryciu tworzony przez zadania
testAllSuitesitestAllSuitesWithDependenciesłączy liczbę kodów bajtowych Javy z tych testów z liczbą kodów bajtowych DEX z agenta. Ze względu na różnice między tymi 2 rodzajami zagregowane liczby instrukcji i gałęzi mogą się różnić od liczb w raportach dotyczących pokrycia kodu w czasie kompilacji.
Inne opinie i problemy zgłaszaj za pomocą narzędzia Issue Tracker.