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. Yani testlerinizin uygulamanızın hangi bölümlerini çalıştırdığını kaydeden bir kod ekler. 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 izler. 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.

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ü). Aracı 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 toplamayı 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şturduğundan 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 Dagger fabrikaları gibi oluşturulmuş olarak ek açıklama eklenen kodlar hariç tüm derlenmiş sınıflar Dagger fabrikaları da dahil olmak üzere modülünüzün kaynak klasörlerinde kaynak dosyası bulunan sınıflar
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ı hariç tutar. 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 değerini ayarlayın veya özelliği 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:

  • Oluşturulan kod: Cihaz üzerindeki raporlar, derleme zamanı raporlarının genellikle atladığı Dagger fabrikaları gibi oluşturulan kodları içerir. Testleriniz bu kodu yürütmüyorsa kod, kapsanmamış olarak sayılır.
  • 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, toplu 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.