Code Coverage (कोड कवरेज) एक मीट्रिक है जो दिखाता है कि परीक्षण के दौरान एप्लिकेशन के सोर्स कोड का कितना प्रतिशत निष्पादित होता है। यह परीक्षणों की गुणवत्ता निर्धारित करने, बिना जांचे गए क्षेत्रों की पहचान करने और नए परीक्षण लिखने को प्राथमिकता देने में मदद करता है। Atlassian, 2025 के अनुसार, इष्टतम कवरेज स्तर 70–80% है — इस सीमा से ऊपर, परीक्षण की लागत लाभ से अधिक होने लगती है।
मुख्य बिंदु
Code Coverage (कोड कवरेज) एक मात्रात्मक मीट्रिक है जो निर्धारित करता है कि एप्लिकेशन के सोर्स कोड का कौन सा भाग परीक्षणों के दौरान निष्पादित किया गया था। इसे प्रतिशत में व्यक्त किया जाता है और निष्पादित लाइनों/ब्रांचों के कुल संख्या के अनुपात के रूप में गणना की जाती है। उच्च कवरेज बग की अनुपस्थिति की गारंटी नहीं देता, लेकिन अनदेखी त्रुटियों के जोखिम को कम करता है।
कोड कवरेज टीम की मदद करता है: कोड के बिना परीक्षण वाले क्षेत्रों को खोजने, परीक्षण लिखने की प्राथमिकताओं पर निर्णय लेने, और CI/CD में परीक्षण गुणवत्ता की गतिशीलता को ट्रैक करने में। मोबाइल डेवलपमेंट में, कवरेज विशेष रूप से बिज़नेस लॉजिक, डेटा मॉडल और रिपॉजिटरी — उन परतों के लिए महत्वपूर्ण है जहाँ त्रुटियों की संभावना सबसे अधिक है।
एक सामान्य मिथक: “100% कवरेज = आदर्श गुणवत्ता”। व्यवहार में, 100% कवरेज अत्यंत दुर्लभ है और अक्सर सतही परीक्षणों की कीमत पर प्राप्त किया जाता है। प्रभावी कवरेज प्रतिशत की दौड़ नहीं है, बल्कि महत्वपूर्ण पथों और सीमांत स्थितियों का रणनीतिक कवरेज है। कवरेज परीक्षणों की गुणवत्ता के बारे में कुछ नहीं कहता: एक परीक्षण पास हो सकता है लेकिन परिणाम की शुद्धता की जाँच नहीं करता।
Code Coverage की कई मेट्रिक्स मौजूद हैं, प्रत्येक परीक्षण के विभिन्न पहलुओं को मापती है। Line coverage (लाइन कवरेज) सबसे सरल मीट्रिक है, जो निष्पादित कोड लाइनों का प्रतिशत दिखाती है। Branch coverage (ब्रांच कवरेज) मापता है कि कौन से if-else और switch शाखाओं का परीक्षण किया गया।
Line coverage प्रत्येक सोर्स कोड लाइन को निष्पादित या नहीं के रूप में गिनता है। यदि किसी लाइन में सशर्त ऑपरेटर या लूप है, तो लाइन को निष्पादित माना जाता है यदि नियंत्रण उस तक पहुँचा, भले ही सभी शाखाएँ संसाधित न हुई हों। यह सबसे कम सख्त मीट्रिक है, लेकिन दृश्य मूल्यांकन के लिए सबसे समझने योग्य है।
Branch coverage मूल्यांकन करता है कि कोड में सभी संभावित शाखाओं का परीक्षण किया गया या नहीं। प्रत्येक if-else के लिए दोनों शाखाएँ मानी जाती हैं: true और false। switch के लिए, प्रत्येक case माना जाता है। Branch coverage को line coverage की तुलना में अधिक सख्त मीट्रिक माना जाता है और यह अक्सर बिना परीक्षण वाले परिदृश्यों को उजागर करता है।
| मीट्रिक | क्या मापता है | प्राप्त करने की कठिनाई |
|---|---|---|
| Line | निष्पादित कोड लाइनों का प्रतिशत | कम |
| Branch | निष्पादित शाखाओं का प्रतिशत (if/else, switch) | मध्यम |
| Function | कॉल किए गए फंक्शन और विधियों का प्रतिशत | कम |
| Condition | तार्किक उप-अभिव्यक्तियों का प्रतिशत (&&, ||) | उच्च |
Path coverage सबसे सख्त मीट्रिक है, जिसमें एक फंक्शन में सभी संभावित संयोजनों की जाँच की आवश्यकता होती है। व्यवहार में, path coverage का उपयोग शायद ही कभी किया जाता है क्योंकि संयोजनों की संख्या तेजी से बढ़ती है: 10 शाखाओं वाले फंक्शन में 1024 संभावित पथ होते हैं।
मोबाइल डेवलपमेंट में, प्लेटफ़ॉर्म के आधार पर Code Coverage मापने के लिए विभिन्न उपकरणों का उपयोग किया जाता है। Android के लिए मानक JaCoCo (Java Code Coverage) है, जो Gradle के साथ एकीकृत होता है और यूनिट टेस्ट और इंस्ट्रूमेंटेशन टेस्ट दोनों का समर्थन करता है। iOS के लिए Xcode में निर्मित XCCov का उपयोग किया जाता है।
JaCoCo HTML, XML और CSV प्रारूपों में रिपोर्ट तैयार करता है। HTML रिपोर्ट दृश्य रूप से लाइनों को हाइलाइट करती है: हरा — निष्पादित, लाल — छोड़ी गई, पीला — आंशिक रूप से निष्पादित। XML रिपोर्ट SonarQube और अन्य कोड विश्लेषण प्रणालियों के साथ संगत है। JaCoCo क्लास फ़िल्टरिंग का समर्थन करता है: जनरेटेड कोड, डेटाबाइंडिंग और BuildConfig को बाहर किया जा सकता है।
// build.gradle — JaCoCo कॉन्फ़िगरेशन
android {
buildTypes {
debug {
testCoverageEnabled = true
}
}
}
// JaCoCo रिपोर्ट जनरेट करना
task jacocoTestReport(type: JacocoReport) {
dependsOn 'testDebugUnitTest'
reports {
xml.enabled = true
html.enabled = true
}
}
XCCov कोड कवरेज मापने के लिए Xcode में निर्मित उपकरण है। इसे परीक्षण योजना में Gather coverage data के माध्यम से सक्षम किया जाता है। XCCov Swift और Objective-C के लिए कवरेज का समर्थन करता है, .xccovreport प्रारूप में रिपोर्ट तैयार करता है और xcodebuild -enableCodeCoverage YES के माध्यम से CI के साथ एकीकृत होता है। डेटा कंसोल पर आउटपुट होता है और JSON में निर्यात किया जा सकता है।
केंद्रीकृत कवरेज निगरानी के लिए SonarQube (कोड गुणवत्ता विश्लेषण + कवरेज), Codecov और Coveralls जैसे प्लेटफ़ॉर्म का उपयोग किया जाता है। ये सेवाएँ JaCoCo और XCCov से डेटा एकत्र करती हैं, रुझान, क्वालिटी गेट और PR टिप्पणियों के माध्यम से GitHub/GitLab के साथ एकीकरण दिखाती हैं।
Code Coverage में सुधार के लिए एक व्यवस्थित दृष्टिकोण की आवश्यकता है: “प्रतिशत बढ़ाना” नहीं, बल्कि जोखिमों को बंद करना। पहला कदम JaCoCo या XCCov रिपोर्ट का विश्लेषण करना है — लाल (बिना कवरेज वाली) क्लासों की पहचान करना। प्राथमिकता: बिज़नेस लॉजिक → रिपॉजिटरी → ViewModel → UI घटक।
Test-Driven Development (TDD) स्वचालित रूप से उच्च कवरेज सुनिश्चित करता है, क्योंकि परीक्षण कार्यान्वयन से पहले लिखे जाते हैं। प्रक्रिया: लाल (असफल परीक्षण लिखना) → हरा (न्यूनतम कोड लिखना) → रीफैक्टर। TDD डेवलपर को अनुशासित करता है, उन्हें सीमांत मामलों और अपवाद स्थितियों को कवर करने के लिए मजबूर करता है जो अक्सर बिना परीक्षण के रह जाती हैं।
एक पैरामीटराइज़्ड टेस्ट दर्जनों सामान्य परीक्षणों की जगह लेता है। JUnit और XCTest पैरामीटराइज़ेशन का समर्थन करते हैं: JUnit 5 में @ParameterizedTest, XCTest में XCTestCase के साथ testPerformanceExample। पैरामीटराइज़ेशन कोड दोहराव के बिना कई इनपुट डेटा की जाँच करने की अनुमति देता है, जो ब्रांच और कंडीशन कवरेज को महत्वपूर्ण रूप से बढ़ाता है।
// Kotlin में JUnit 5 के साथ पैरामीटराइज़्ड टेस्ट
@ParameterizedTest
@ValueSource(strings = ["user@test.com", "admin@test.com", "test@example.com"])
fun `validate email returns true for valid addresses`(email: String) {
val result = EmailValidator.isValid(email)
Assertions.assertTrue(result)
}
सबसे आम गलती है परीक्षणों की गुणवत्ता का विश्लेषण किए बिना प्रतिशत का पीछा करना। टीम परीक्षणों के लिए परीक्षण लिखना शुरू कर देती है: गेटर्स और सेटर्स की जाँच करना, विभिन्न स्तरों पर कवरेज दोहराना, तुच्छ विधियों का परीक्षण करना। यह उच्च प्रतिशत देता है लेकिन वास्तविक गुणवत्ता में सुधार नहीं करता।
उच्च Code Coverage एक झूठी भावना पैदा कर सकता है कि एप्लिकेशन अच्छी तरह से परीक्षण किया गया है। एक परीक्षण कोड की एक लाइन निष्पादित कर सकता है लेकिन परिणाम की शुद्धता की जाँच नहीं करता। उदाहरण के लिए: एक परीक्षण छूट गणना विधि को कॉल करता है लेकिन राशि की जाँच नहीं करता — लाइन निष्पादित हुई, कवरेज बढ़ा, लेकिन बग नहीं मिला।
एक विशिष्ट गलती केवल “हैप्पी पाथ” (happy path) का परीक्षण करना और सीमांत मामलों की अनदेखी करना है: खाली सूचियाँ, null मान, अधिकतम संख्याएँ, गलत प्रारूप। अधिकांश बग सीमाओं और अपवादों पर होते हैं। Branch coverage छूटी हुई शाखाओं की पहचान करने में मदद करता है, लेकिन सीमांत मानों की जाँच की गारंटी नहीं देता।
म्यूटेशन टेस्टिंग परीक्षणों की गुणवत्ता का मूल्यांकन करने की एक विधि है जहाँ सोर्स कोड में म्यूटेशन (कृत्रिम त्रुटियाँ) डाली जाती हैं और जाँच की जाती है कि परीक्षण असफल होते हैं या नहीं। Pitest Java और Kotlin के लिए एक लोकप्रिय म्यूटेशन टेस्टिंग उपकरण है। यदि परीक्षण किसी म्यूटेशन पर असफल नहीं होते, तो वे उस शर्त की जाँच नहीं कर रहे हैं।
Pitest म्यूटेंट बनाता है — सोर्स कोड की संशोधित प्रतियाँ जहाँ, उदाहरण के लिए, > को >=, true को false से बदल दिया जाता है, या एक विधि कॉल हटा दिया जाता है। फिर प्रत्येक म्यूटेंट के लिए परीक्षण चलाए जाते हैं। यदि परीक्षण पास होते हैं — म्यूटेंट बच गया, जिसका अर्थ है कि परीक्षण उस परिदृश्य को कवर नहीं करते। यदि परीक्षण असफल होते हैं — म्यूटेंट मारा गया, परीक्षण सही है।
// build.gradle — Pitest कॉन्फ़िगरेशन
plugins {
id 'info.solidsoft.pitest' version '1.15.0'
}
pitest {
targetClasses = ['com.example.app.*']
targetTests = ['com.example.app.*Test']
threads = 4
outputFormats = ['HTML', 'XML']
mutationThreshold = 80
coverageThreshold = 85
}
Pitest कई प्रकार के म्यूटेशन का समर्थन करता है: सशर्त ऑपरेटरों को बदलना (== → !=, < → <=), विधि कॉल हटाना, रिटर्न वैल्यू बदलना (true → false), अंकगणितीय संक्रियाएँ बदलना (+ → -), इंक्रीमेंट म्यूटेशन (i++ → i--)। जितने अधिक प्रकार के म्यूटेशन परीक्षणों द्वारा मारे जाते हैं, परीक्षण सेट उतना ही अधिक विश्वसनीय होता है।
लक्ष्य म्यूटेशन स्कोर 80% और उससे ऊपर है। इसका मतलब है कि 80% कृत्रिम त्रुटियाँ परीक्षणों द्वारा पाई जाती हैं। 90% कोड कवरेज यह गारंटी नहीं देता कि परीक्षण बग ढूँढ़ते हैं — म्यूटेशन टेस्टिंग अधिक वस्तुनिष्ठ मूल्यांकन प्रदान करता है। Pitest को CI में क्वालिटी गेट के रूप में एकीकृत किया जा सकता है, जो म्यूटेशन स्कोर के सीमा से नीचे गिरने पर बिल्ड को ब्लॉक करता है।
CI/CD में Code Coverage के स्वचालित नियंत्रण के लिए क्वालिटी गेट्स का उपयोग किया जाता है — सीमा मान, जिनके उल्लंघन पर बिल्ड को अस्थिर चिह्नित किया जाता है या अस्वीकार कर दिया जाता है। SonarQube मेट्रिक्स के संयोजन के आधार पर क्वालिटी गेट कॉन्फ़िगर करने की अनुमति देता है: कवरेज (≥80%), बगों की संख्या, कमजोरियाँ और डुप्लिकेट कोड।
GitHub Actions में, Code Coverage को एक्शन चरणों के माध्यम से एकीकृत किया जाता है: कवरेज के साथ परीक्षण चलाएँ → रिपोर्ट Codecov पर अपलोड करें → सीमा जाँचें। Codecov स्वचालित रूप से PR पर कवरेज डिफ़ के साथ टिप्पणी करता है, दिखाता है कि कौन सी लाइनें बदली हैं और इसने समग्र प्रतिशत को कैसे प्रभावित किया। यदि कवरेज गिर गया, तो PR तब तक ब्लॉक किया जाता है जब तक अतिरिक्त परीक्षण न लिखे जाएँ।
# GitHub Actions — Codecov पर कवरेज अपलोड करना
- name: Run Tests with Coverage
run: ./gradlew testDebugUnitTest jacocoTestReport
- name: Upload to Codecov
uses: codecov/codecov-action@v4
with:
files: ./app/build/reports/jacoco/jacocoTestReport.xml
flags: unittests
fail_ci_if_error: true
- name: Check Coverage Threshold
run: |
coverage=$(grep -oP 'branchCoverage="\K[0-9.]+' report.xml)
if (( $(echo "$coverage < 80" | bc -l) )); then
echo "Coverage $coverage% is below 80% threshold"
exit 1
fi
JaCoCo और XCCov की HTML रिपोर्ट में दृश्य कवरेज हाइलाइटिंग होती है: हरा — निष्पादित लाइनें, लाल — निष्पादित नहीं। SonarQube अतिरिक्त रूप से फ़ाइल, क्लास, विधि और लाइन स्तर पर कवरेज दिखाता है, साथ ही स्प्रिंट के अनुसार कवरेज परिवर्तन का इतिहास भी दिखाता है। यह रीफैक्टरिंग और परीक्षण जोड़ने के बारे में निर्णय लेने में मदद करता है।
अक्सर पूछे जाने वाले प्रश्न
मोबाइल प्रोजेक्ट्स के लिए, बिज़नेस लॉजिक के लिए 70–80% और UI घटकों के लिए 50–60% कवरेज अच्छा माना जाता है। 80% से ऊपर, परीक्षण की लागत लाभ से अधिक होने लगती है। यह याद रखना महत्वपूर्ण है कि प्रतिशत कोई लक्ष्य नहीं बल्कि एक संकेतक है, और विभिन्न मॉड्यूल के अलग-अलग लक्ष्य स्तर हो सकते हैं।
Line Coverage दिखाता है कि कितनी कोड लाइनें निष्पादित की गईं। Branch Coverage दिखाता है कि कितनी शाखाएँ (if-else, switch) का परीक्षण किया गया। if वाली लाइन निष्पादित हो सकती है, लेकिन केवल true शाखा का परीक्षण किया गया हो, false का नहीं। Branch Coverage अधिक सख्त है और अधिक छूटे हुए परिदृश्यों को उजागर करता है।
CI/CD में, कवरेज को क्वालिटी गेट के माध्यम से एकीकृत किया जाता है: यदि कवरेज सीमा से नीचे है तो बिल्ड ब्लॉक हो जाता है। Android के लिए JaCoCo + SonarQube का उपयोग किया जाता है, iOS के लिए — xcodebuild -enableCodeCoverage के साथ .xccovreport पार्सिंग। GitHub Actions में Codecov के लिए तैयार एक्शन हैं।
हाँ, JaCoCo मानक JVM कवरेज तंत्र के माध्यम से Jetpack Compose का समर्थन करता है। हालाँकि, Compose कोड में कई जनरेटेड lambda व्यंजक होते हैं जिन्हें JaCoCo पूरी तरह से कवर नहीं कर सकता। फ़िल्टर के माध्यम से जनरेटेड compose कोड को रिपोर्ट से बाहर करने की सिफारिश की जाती है।
झूठी कवरेज तब होती है जब परीक्षण कोड निष्पादित करता है लेकिन परिणाम की जाँच नहीं करता। समाधान: प्रत्येक महत्वपूर्ण परिदृश्य के लिए assert जाँच लिखें, परीक्षणों की गुणवत्ता की जाँच के लिए म्यूटेशन टेस्टिंग (Pitest) का उपयोग करें, न केवल प्रतिशत बल्कि यह भी विश्लेषण करें कि कौन सी शाखाएँ कवर हैं।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें