Melihat laporan cakupan kode (dengan agen di perangkat)

Plugin Android Gradle (AGP) dapat membuat laporan cakupan kode untuk pengujian berinstrumen Anda dengan agen cakupan di perangkat. Secara default, AGP melengkapi class aplikasi Anda dengan JaCoCo saat mem-build aplikasi, yang berarti AGP menambahkan kode yang mencatat bagian aplikasi mana yang dijalankan pengujian Anda. Dengan agen cakupan di perangkat, AGP akan mem-build aplikasi Anda tanpa kode tambahan ini, dan agen akan menginstrumentasi class aplikasi di perangkat pengujian saat pengujian berjalan. Halaman ini menjelaskan cara mengaktifkan cakupan kode di perangkat dan membuat laporan.

Dibandingkan dengan cakupan kode waktu build, cakupan kode di perangkat menawarkan manfaat berikut:

  • Build yang lebih cepat: AGP tidak menjalankan langkah instrumentasi JaCoCo pada class aplikasi Anda dan dependensinya, yang dapat mengurangi waktu build sebesar 10-20%.
  • APK debug yang lebih kecil: AGP tidak menambahkan kode pelacakan cakupan ke class aplikasi Anda, yang dapat membuat APK debug Anda 20-25% lebih kecil.
  • Tidak ada class yang dihasilkan yang tidak digunakan dalam laporan: Class yang dihasilkan yang tidak digunakan oleh pengujian Anda tidak akan menurunkan angka cakupan.

Peningkatan waktu build dan ukuran APK yang sebenarnya bergantung pada project Anda.

Prasyarat

Untuk menggunakan cakupan kode di perangkat, pastikan project dan perangkat pengujian Anda memenuhi persyaratan berikut:

  • AGP 9.6.0-alpha01 atau yang lebih tinggi.
  • Perangkat atau emulator yang menjalankan Android 9 (level API 28) atau yang lebih tinggi.
  • Jenis build yang dapat di-debug untuk varian yang Anda uji, seperti jenis build debug default. Agen hanya dapat dilampirkan ke aplikasi yang dapat di-debug.
  • Pengujian berinstrumen yang berjalan dengan AndroidJUnitRunner atau runner pengujian kustom yang memperluasnya.

Mengaktifkan cakupan kode di perangkat

Cakupan kode di perangkat menggunakan properti enableAndroidTestCoverage yang sama dengan cakupan kode waktu build. Tetapkan enableAndroidTestCoverage ke true dalam file build level modul untuk setiap varian yang ingin Anda dapatkan laporan cakupannya:

Kotlin

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

Groovy

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

Kemudian, aktifkan agen cakupan di perangkat dan agregasi laporan di file gradle.properties project Anda:

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

Cakupan kode di perangkat menghasilkan laporan HTML dengan perender yang sama seperti laporan cakupan kode terpadu, sehingga memerlukan kedua properti.

Membuat laporan cakupan kode di perangkat

Untuk menjalankan uji instrumentasi dan membuat laporan cakupan, hubungkan perangkat atau mulai emulator, lalu jalankan tugas berikut:

Cakupan liputan Perintah Lokasi laporan
Satu varian ./gradlew :module-name:createVariantNameAndroidTestCoverageReport path-to-your-project/module-name/build/reports/coverage/androidTest/variant/connected/index.html

Perbedaan dengan cakupan kode waktu build

Laporan cakupan di perangkat dan waktu build dapat menampilkan hasil yang berbeda untuk pengujian yang sama. Perhatikan perbedaan berikut saat Anda membandingkan kedua laporan, atau saat Anda memindahkan nilai minimum cakupan dari satu laporan ke laporan lainnya:

Area Cakupan kode waktu build Cakupan kode di perangkat
Kapan class diinstrumentasikan Saat AGP mem-build aplikasi Anda, menggunakan JaCoCo Di perangkat pengujian saat pengujian berjalan, menggunakan agen cakupan
Class dalam laporan Semua class dalam modul Anda Hanya class dalam namespace modul Anda yang dimuat saat pengujian berjalan, sehingga persentase cakupan dapat lebih tinggi
Jumlah petunjuk Petunjuk bytecode Java Petunjuk bytecode DEX
Jumlah cabang Percabangan dalam bytecode Java Cabang dalam bytecode DEX. D8 dapat mengompilasi kondisi ke dalam cabang yang berbeda, dan setiap alat mengabaikan cabang yang dihasilkan compiler yang berbeda, sehingga jumlahnya dapat berbeda.
Penghitung Petunjuk, cabang, baris, kompleksitas, metode, dan class Petunjuk, cabang, baris, metode, dan class. Penghitung kompleksitas belum didukung.
Perangkat pengujian Semua level API yang didukung aplikasi Anda Android 9 (API level 28) dan yang lebih tinggi
Data cakupan mentah .ec file File coverage_metadata.pb dan coverage_hits.pb

Untuk beralih kembali ke cakupan kode waktu build, tetapkan android.experimental.androidTest.coverage.useOnDeviceAgent=false atau hapus properti. Anda tidak perlu mengubah file build atau tugas yang Anda jalankan.

Masalah umum

Cakupan kode di perangkat memiliki masalah umum berikut:

  • Class yang tidak dimuat: Class yang tidak pernah dimuat saat pengujian berjalan tidak akan muncul dalam laporan. Laporan cakupan kode waktu build mencantumkannya dengan cakupan 0%.
  • Laporan gabungan: Jika project Anda juga mengumpulkan cakupan dari pengujian host, seperti pengujian unit, laporan cakupan gabungan yang dibuat oleh tugas testAllSuites dan testAllSuitesWithDependencies akan menggabungkan jumlah bytecode Java dari pengujian tersebut dengan jumlah bytecode DEX dari agen. Karena perbedaan antara keduanya, jumlah petunjuk dan cabang gabungan dapat berbeda dari jumlah dalam laporan cakupan kode waktu build.

Laporkan masukan dan masalah lainnya melalui issue tracker.