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
debugderleme türü). Aracı yalnızca hata ayıklanabilir uygulamalara bağlanabilir. AndroidJUnitRunnerveya 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
testAllSuitesvetestAllSuitesWithDependenciesgö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.