C# में कोड कवरेज टेस्टिंग: मेट्रिक्स से गुणवत्ता तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

"हरे" टेस्ट का मतलब जीत नहीं है?

\n\n

कल्पना करें: आपने सौ यूनिट टेस्ट लिखे, सभी हरे निशान के साथ पास होते हैं, CI-पाइपलाइन खुश है, मैनेजर संतुष्ट है। लेकिन एक महीने बाद प्रोडक्शन में एक महत्वपूर्ण फीचर फेल हो जाता है। परिचित कहानी? अक्सर समस्या यह होती है कि हम गलत परिदृश्यों का परीक्षण कर रहे हैं या कोड की पूरी शाखाओं को छोड़ रहे हैं।

\n\n

कोड कवरेज (code coverage) सिर्फ रिपोर्ट के लिए एक फैशनेबल मीट्रिक नहीं है। यह अनिश्चितता के अंधेरे कमरे में आपकी टॉर्च है। जब मैंने C# के साथ काम करना शुरू किया, तो मैंने सोचा कि 80% कवरेज आदर्श है। लेकिन बाद में मुझे एहसास हुआ: लाइनों का 100% कवरेज हो सकता है और फिर भी ब्रांचिंग लॉजिक में बग छूट सकता है। इसलिए आज हम समझेंगे कि C# में कवरेज को सही तरीके से कैसे मापें, कौन से उपकरण वास्तव में मदद करते हैं, और किन मेट्रिक्स पर नज़र रखनी चाहिए।

\n\n

कोड कवरेज क्या है और यह C# डेवलपर के लिए क्यों महत्वपूर्ण है?

\n\n

सीधे शब्दों में कहें तो, कोड कवरेज दिखाता है कि आपके एप्लिकेशन का कितना प्रतिशत सोर्स कोड टेस्ट चलाने के दौरान निष्पादित हुआ। यदि आपने एक टेस्ट लिखा है जो CalculateDiscount() मेथड को कॉल करता है, लेकिन if (isPremiumUser) शाखा की जाँच नहीं करता, तो वह शाखा "अनकवर्ड" रहती है।

\n\n

C# डेवलपर के लिए, कवरेज दो चीजों का संकेतक है:

\n
    \n
  • रिफैक्टरिंग में विश्वास — क्या कोड को बदलना सुरक्षित है बिना कुछ तोड़ने के डर के?
  • \n
  • टेस्ट की पूर्णता — क्या हम सीमांत मामलों के बारे में भूल गए हैं?
  • \n
\n\n

लेकिन एक महत्वपूर्ण बात: C# में कोड कवरेज बग की अनुपस्थिति की गारंटी नहीं देता। यह केवल यह बताता है कि कुछ निश्चित लाइनें निष्पादित हुईं। यही कारण है कि हम सिर्फ प्रतिशत नहीं, बल्कि विशिष्ट मेट्रिक्स देखते हैं।

\n\n

.NET में कोड कवरेज की मुख्य मेट्रिक्स

\n\n

जब आप C# में कवरेज विश्लेषण चलाते हैं, तो आपको कई प्रकार की मेट्रिक्स मिलती हैं। आइए वास्तविक कोड के उदाहरण के साथ प्रत्येक को समझें।

\n\n

Line Coverage (लाइन कवरेज)

\n

सबसे सरल मीट्रिक। यह गिनता है कि कोड की कितनी लाइनें टेस्ट द्वारा कवर की गईं। उदाहरण:

\n\n
public int Add(int a, int b)\n{\n    if (a < 0)          // लाइन 1\n        return 0;       // लाइन 2\n    return a + b;        // लाइन 3\n}
\n\n

यदि आपका टेस्ट Add(5, 3) को कॉल करता है, तो लाइन 1 और 3 निष्पादित होंगी। लाइन 2 अनकवर्ड रहेगी। Line coverage 66% (3 में से 2 लाइनें) दिखाएगा।

\n\n

Branch Coverage (ब्रांच कवरेज)

\n

अधिक ईमानदार मीट्रिक। यह निष्पादन के सभी संभावित पथों को ध्यान में रखता है। हमारे उदाहरण में दो पथ हैं: जब a < 0 और जब नहीं। यदि आपने केवल धनात्मक संख्या वाले मामले की जाँच की, तो Branch coverage 50% होगा।

\n\n

Branch coverage ही अक्सर टेस्ट में "छेद" को उजागर करता है। मैं इस मीट्रिक पर 80%+ का लक्ष्य रखने की सलाह देता हूँ।

\n\n

Cyclomatic Complexity और कवरेज से इसका संबंध

\n

हालाँकि यह प्रत्यक्ष कवरेज मीट्रिक नहीं है, चक्रीय जटिलता दिखाती है कि पूर्ण कवरेज के लिए कितने टेस्ट लिखने की आवश्यकता है। मेथड की जटिलता जितनी अधिक होगी, उतने ही अधिक टेस्ट की आवश्यकता होगी। यदि आप 15 की चक्रीय जटिलता वाला मेथड देखते हैं और कवरेज 90% है — तो संभवतः आप सभी परिदृश्यों का परीक्षण नहीं कर रहे हैं।

\n\n

C# में कोड कवरेज मापने के उपकरण

\n\n

.NET इकोसिस्टम में कई शक्तिशाली उपकरण हैं। मैं तीन सबसे लोकप्रिय के बारे में बताऊँगा, जिनके साथ मैंने स्वयं काम किया है।

\n\n

Coverlet — मुफ्त और .NET में एकीकृत

\n

यदि आप .NET 6+ का उपयोग कर रहे हैं, तो Coverlet NuGet के माध्यम से पहले से उपलब्ध है। CI/CD के लिए यह मेरा पसंदीदा उपकरण है, क्योंकि इसे अतिरिक्त प्रोग्राम स्थापित करने की आवश्यकता नहीं है।

\n\n

स्थापना:

\n
dotnet add package coverlet.msbuild\ndotnet add package coverlet.collector
\n\n

रिपोर्ट के साथ चलाना:

\n
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
\n\n

आपको coverage.opencover.xml फ़ाइल मिलेगी, जिसे ReportGenerator के साथ विज़ुअलाइज़ किया जा सकता है:

\n
dotnet tool install -g dotnet-reportgenerator-globaltool\nreportgenerat                

ब्लॉग

पुस्तक अनुशंसाएँ