Kod kapsamı raporlarını görüntüleme (cihaz üzerinde temsilci ile)

Android Gradle eklentisi (AGP), cihaz üzerinde kapsam aracısı ile enstrümantasyon testleriniz için kod kapsamı raporları oluşturabilir. AGP, varsayılan olarak uygulamanızı derlerken uygulamanızın sınıflarını JaCoCo ile donatır. Bu, testlerinizin uygulamanızın hangi bölümlerini çalıştırdığını kaydeden kod eklediği anlamına gelir. Cihaz üzerinde kapsam aracısı sayesinde AGP, uygulamanızı bu ek kod olmadan derler ve testleriniz çalışırken uygulamanızın sınıflarını test cihazında araçlarla donatır. Bu sayfada, cihaz üzerinde kod kapsamının nasıl etkinleştirileceği ve raporların nasıl oluşturulacağı açıklanmaktadır.

Derleme zamanı kod kapsamıyla karşılaştırıldığında, cihaz üzerinde kod kapsamı aşağıdaki avantajları sunar:

  • Daha hızlı derlemeler: AGP, uygulamanızın sınıflarında ve bağımlılıklarında JaCoCo araçlandırma adımını çalıştırmaz. Bu da derleme sürelerini %10-20 oranında azaltabilir.
  • Daha küçük hata ayıklama APK'ları: AGP, uygulamanızın sınıflarına kapsam izleme kodu eklemez. Bu sayede hata ayıklama APK'nız% 20-25 daha küçük olabilir.
  • Raporlarda kullanılmayan oluşturulmuş sınıflar yok: Testlerinizin kullanmadığı oluşturulmuş sınıflar, kapsam sayılarınızı düşürmez.

Gerçek derleme süresi ve APK boyutu iyileştirmeleri projenize bağlıdır.

Ön koşullar

Cihaz üzerinde kod kapsamını kullanmak için projenizin ve test cihazlarınızın aşağıdaki koşulları karşıladığından emin olun:

  • AGP 9.6.0-alpha01 veya sonraki sürümler
  • Android 9 (API düzeyi 28) veya sonraki sürümleri çalıştıran bir cihaz ya da emülatör.
  • Test ettiğiniz varyant için hata ayıklanabilir bir derleme türü (ör. varsayılan debug derleme türü). Temsilci yalnızca hata ayıklanabilir uygulamalara bağlanabilir.
  • AndroidJUnitRunner veya bunu genişleten özel bir test çalıştırıcı ile çalışan araçlı testler.

Cihaz üzerinde kod kapsamını etkinleştirme

Cihaz üzerinde kod kapsamı, derleme zamanı kod kapsamıyla aynı enableAndroidTestCoverage özelliğini kullanır. Kapsam raporu almak istediğiniz her varyant için modül düzeyindeki derleme dosyalarında enableAndroidTestCoverage değerini true olarak ayarlayın:

Kotlin

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

Modern

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

Ardından, projenizin gradle.properties dosyasında cihaz üzerinde kapsam aracısını ve rapor toplama özelliğini etkinleştirin:

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

Cihaz üzerinde kod kapsamı, HTML raporunu birleştirilmiş kod kapsamı raporlarıyla aynı oluşturucuyla oluşturur. Bu nedenle her iki özelliği de gerektirir.

Cihaz üzerinde kod kapsamı raporları oluşturma

Araçlı testlerinizi çalıştırmak ve kapsam raporları oluşturmak için bir cihaz bağlayın veya emülatör başlatın, ardından aşağıdaki görevi çalıştırın:

Kapsam Komut Rapor konumu
Bir varyant ./gradlew :module-name:createVariantNameAndroidTestCoverageReport path-to-your-project/module-name/build/reports/coverage/androidTest/variant/connected/index.html

Derleme zamanı kod kapsamından farklar

Cihaz üzerinde ve derleme zamanı kapsam raporları, aynı testler için farklı sonuçlar gösterebilir. İki raporu karşılaştırırken veya kapsam eşiklerini birinden diğerine taşırken aşağıdaki farkları göz önünde bulundurun:

Alan Derleme zamanı kod kapsamı Cihaz üzerinde kod kapsamı
Sınıflar ne zaman izlenir? AGP, JaCoCo kullanarak uygulamanızı derlediğinde Testleriniz çalışırken test cihazında, kapsam aracısını kullanarak
Rapordaki sınıflar Modülünüzdeki tüm sınıflar Yalnızca testleriniz çalışırken yüklenen modülünüzün ad alanındaki sınıflar. Bu sayede kapsam yüzdeleri daha yüksek olabilir.
Instruction counts Java bayt kodu talimatları DEX bayt kodu talimatları
Dal sayıları Java bayt kodundaki dallar DEX bayt kodundaki dallar. D8, koşulları farklı dallarda derleyebilir ve her araç, derleyici tarafından oluşturulan farklı dalları dışarıda bırakır. Bu nedenle sayılar farklı olabilir.
Sayaçlar Talimatlar, dallar, satırlar, karmaşıklık, yöntemler ve sınıflar Talimatlar, dallar, satırlar, yöntemler ve sınıflar. Karmaşıklık sayaçları henüz desteklenmiyor.
Test cihazları Uygulamanızın desteklediği tüm API düzeyleri Android 9 (API düzeyi 28) ve sonraki sürümler
Ham kapsam verileri .ec dosya coverage_metadata.pb ve coverage_hits.pb dosya

Derleme zamanı kod kapsamına geri dönmek için android.experimental.androidTest.coverage.useOnDeviceAgent=false özelliğini ayarlayın veya kaldırın. Derleme dosyalarınızı veya çalıştırdığınız görevleri değiştirmeniz gerekmez.

Bilinen sorunlar

Cihaz üzerinde kod kapsamıyla ilgili bilinen sorunlar şunlardır:

  • Yüklenmeyen sınıflar: Testleriniz çalışırken hiç yüklenmeyen sınıflar raporda görünmez. Derleme zamanı kod kapsamı raporları, bunları% 0 kapsamla listeler.
  • Birleştirilmiş raporlar: Projeniz, birim testleri gibi ana makine testlerinden de kapsam topluyorsa testAllSuites ve testAllSuitesWithDependencies görevlerinin oluşturduğu birleştirilmiş kapsam raporu, bu testlerdeki Java bayt kodu sayılarını aracıdaki DEX bayt kodu sayılarıyla birleştirir. İkisi arasındaki farklar nedeniyle, birleştirilmiş talimat ve dal sayıları, derleme zamanı kod kapsamı raporlarındaki sayılardan farklı olabilir.

Diğer geri bildirimleri ve sorunları Issue Tracker üzerinden bildirin.