Android Gradle प्लग इन (एजीपी), डिवाइस पर मौजूद कवरेज एजेंट की मदद से, इंस्ट्रुमेंटेड टेस्ट के लिए कोड कवरेज रिपोर्ट बना सकता है. डिफ़ॉल्ट रूप से, एजीपी आपके ऐप्लिकेशन को बनाते समय, JaCoCo की मदद से आपके ऐप्लिकेशन की क्लास को इंस्ट्रुमेंट करता है. इसका मतलब है कि यह ऐसा कोड जोड़ता है जो यह रिकॉर्ड करता है कि आपके टेस्ट, आपके ऐप्लिकेशन के किन हिस्सों को चलाते हैं. उपयोगकर्ता के डिवाइस पर कवरेज एजेंट की मदद से, एजीपी आपके ऐप्लिकेशन को इस अतिरिक्त कोड के बिना बनाता है. साथ ही, टेस्ट चलने के दौरान एजेंट, टेस्ट के लिए डिवाइस पर आपके ऐप्लिकेशन की क्लास को इंस्ट्रुमेंट करता है. इस पेज पर, डिवाइस पर कोड कवरेज की सुविधा चालू करने और रिपोर्ट जनरेट करने का तरीका बताया गया है.
बिल्ड-टाइम कोड कवरेज की तुलना में, उपयोगकर्ता के डिवाइस पर कोड कवरेज के ये फ़ायदे हैं:
- तेज़ी से बिल्ड बनाना: एजीपी, आपके ऐप्लिकेशन की क्लास और उनकी डिपेंडेंसी पर JaCoCo इंस्ट्रुमेंटेशन का चरण नहीं चलाता. इससे बिल्ड बनाने में लगने वाला समय 10 से 20% तक कम हो सकता है.
- छोटे साइज़ वाले डीबग APK: एजीपी, आपके ऐप्लिकेशन की क्लास में कवरेज-ट्रैकिंग कोड नहीं जोड़ता. इससे आपके डीबग APK का साइज़ 20 से 25% तक छोटा हो सकता है.
- रिपोर्ट में, जनरेट की गई ऐसी क्लास शामिल नहीं होतीं जिनका इस्तेमाल नहीं किया गया है: जनरेट की गई ऐसी क्लास जिनका इस्तेमाल आपके टेस्ट नहीं करते हैं वे आपके कवरेज नंबर को कम नहीं करती हैं.
बिल्ड टाइम और APK के साइज़ में होने वाले सुधार, आपके प्रोजेक्ट पर निर्भर करते हैं.
ज़रूरी शर्तें
डिवाइस पर कोड कवरेज की सुविधा इस्तेमाल करने के लिए, पक्का करें कि आपका प्रोजेक्ट और टेस्ट डिवाइस इन ज़रूरी शर्तों को पूरा करते हों:
- AGP 9.6.0-alpha01 या इसके बाद का वर्शन.
- Android 9 (एपीआई लेवल 28) या इसके बाद के वर्शन पर चलने वाला डिवाइस या एम्युलेटर.
- जिस वैरिएंट की जांच करनी है उसके लिए डीबग करने लायक बिल्ड टाइप. जैसे, डिफ़ॉल्ट
debugबिल्ड टाइप. एजेंट को सिर्फ़ डीबग करने लायक ऐप्लिकेशन से अटैच किया जा सकता है. AndroidJUnitRunnerया इसे एक्सटेंड करने वाले कस्टम टेस्ट रनर के साथ चलने वाले इंस्ट्रुमेंटेड टेस्ट.
डिवाइस पर कोड कवरेज की सुविधा चालू करना
उपयोगकर्ता के डिवाइस पर कोड कवरेज, उसी enableAndroidTestCoverage प्रॉपर्टी का इस्तेमाल करता है जिसका इस्तेमाल बिल्ड-टाइम कोड कवरेज करता है. हर उस वैरिएंट के लिए, मॉड्यूल-लेवल की बिल्ड फ़ाइलों में enableAndroidTestCoverage को true पर सेट करें जिसकी आपको कवरेज रिपोर्ट चाहिए:
Kotlin
android {
// ...
buildTypes {
debug {
// Enable coverage for instrumentation tests
enableAndroidTestCoverage = true
}
}
}
Groovy
android {
// ...
buildTypes {
debug {
// Enable coverage for instrumentation tests
enableAndroidTestCoverage true
}
}
}
इसके बाद, अपने प्रोजेक्ट की gradle.properties फ़ाइल में, उपयोगकर्ता के डिवाइस पर कवरेज एजेंट और रिपोर्ट एग्रीगेशन को चालू करें:
android.experimental.androidTest.coverage.useOnDeviceAgent=true
android.experimental.reportAggregationSupport=true
उपयोगकर्ता के डिवाइस पर कोड कवरेज, अपनी एचटीएमएल रिपोर्ट को उसी रेंडरर के साथ जनरेट करता है जिसके साथ यूनिफ़ाइड कोड कवरेज रिपोर्ट जनरेट होती है. इसलिए, इसके लिए दोनों प्रॉपर्टी ज़रूरी हैं.
डिवाइस पर कोड कवरेज रिपोर्ट जनरेट करना
इंस्ट्रुमेंटेड टेस्ट चलाने और कवरेज रिपोर्ट जनरेट करने के लिए, कोई डिवाइस कनेक्ट करें या कोई एम्युलेटर शुरू करें. इसके बाद, यह टास्क चलाएं:
| कवरेज का दायरा | निर्देश | जगह की जानकारी की शिकायत करना |
|---|---|---|
| एक वैरिएंट | ./gradlew :module-name:createVariantNameAndroidTestCoverageReport |
path-to-your-project/module-name/build/reports/coverage/androidTest/variant/connected/index.html |
बिल्ड-टाइम कोड कवरेज से अंतर
उपयोगकर्ता के डिवाइस पर और बिल्ड-टाइम कवरेज रिपोर्ट, एक ही टेस्ट के लिए अलग-अलग नतीजे दिखा सकती हैं. दोनों रिपोर्ट की तुलना करते समय या कवरेज थ्रेशोल्ड को एक से दूसरे पर ले जाते समय, इन अंतरों को ध्यान में रखें:
| जगह | बिल्ड-टाइम कोड कवरेज | उपयोगकर्ता के डिवाइस पर कोड कवरेज |
|---|---|---|
| क्लास को कब इंस्ट्रुमेंट किया जाता है | जब AGP, JaCoCo का इस्तेमाल करके आपका ऐप्लिकेशन बनाता है | टेस्ट डिवाइस पर, टेस्ट चलने के दौरान कवरेज एजेंट का इस्तेमाल करना |
| रिपोर्ट में शामिल क्लास | आपके मॉड्यूल की सभी क्लास | सिर्फ़ आपके मॉड्यूल के नेमस्पेस की वे क्लास जो आपके टेस्ट चलने के दौरान लोड होती हैं. इससे कवरेज का प्रतिशत ज़्यादा हो सकता है |
| निर्देशों की संख्या | Java बाइट कोड के निर्देश | DEX बाइट कोड के निर्देश |
| ब्रांच की संख्या | Java बाइट कोड में ब्रांच | DEX बाइट कोड में ब्रांच. D8, शर्तों को अलग-अलग ब्रांच में कंपाइल कर सकता है. साथ ही, हर टूल कंपाइलर से जनरेट की गई अलग-अलग ब्रांच को छोड़ देता है. इसलिए, संख्याएं अलग-अलग हो सकती हैं. |
| काउंटर | निर्देश, ब्रांच, लाइनें, जटिलता, तरीके, और क्लास | निर्देश, ब्रांच, लाइन, तरीके, और क्लास. फ़िलहाल, कॉम्प्लेक्सिटी काउंटर की सुविधा उपलब्ध नहीं है. |
| टेस्ट डिवाइस | वे सभी एपीआई लेवल जिन पर आपका ऐप्लिकेशन काम करता है | Android 9 (एपीआई लेवल 28) और इसके बाद के वर्शन |
| रॉ कवरेज डेटा | .ec फ़ाइलें |
coverage_metadata.pb और coverage_hits.pb फ़ाइलें |
बिल्ड-टाइम कोड कवरेज पर वापस जाने के लिए, android.experimental.androidTest.coverage.useOnDeviceAgent=false सेट करें या प्रॉपर्टी हटाएं. आपको अपनी बिल्ड फ़ाइलों या चलाए जा रहे टास्क में बदलाव करने की ज़रूरत नहीं है.
पहले से मालूम समस्याएं
उपयोगकर्ता के डिवाइस पर कोड कवरेज की सुविधा में ये समस्याएं हैं:
- लोड न होने वाली क्लास: टेस्ट के दौरान लोड न होने वाली क्लास, रिपोर्ट में नहीं दिखती हैं. बिल्ड-टाइम कोड कवरेज रिपोर्ट में, उन्हें 0% कवरेज के साथ दिखाया जाता है.
- एग्रीगेट की गई रिपोर्ट: अगर आपका प्रोजेक्ट, होस्ट टेस्ट (जैसे, यूनिट टेस्ट) से भी कवरेज इकट्ठा करता है, तो
testAllSuitesऔरtestAllSuitesWithDependenciesटास्क से बनाई गई एग्रीगेट कवरेज रिपोर्ट, उन टेस्ट से मिले Java बाइट कोड की संख्या को एजेंट से मिले DEX बाइट कोड की संख्या के साथ जोड़ती है. दोनों के बीच अंतर होने की वजह से, एग्रीगेट किए गए निर्देश और ब्रांच नंबर, बिल्ड-टाइम कोड कवरेज रिपोर्ट में मौजूद नंबर से अलग हो सकते हैं.
समस्या ट्रैकर की मदद से, किसी अन्य समस्या की शिकायत करें और सुझाव/राय दें या शिकायत करें.