Wyświetlanie raportów o pokryciu kodu (z agentem na urządzeniu)

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ą AndroidJUnitRunner lub 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 testAllSuites i testAllSuitesWithDependencies łą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.