रस्ट में कोड कवरेज टेस्टिंग: शून्य से आत्मविश्वास तक

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

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

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

कोड कवरेज सिर्फ CI/CD में एक टिक क्यों नहीं है?

\n\n

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

\n\n

लेकिन ईमानदारी से कहें तो: 100% कवरेज का पीछा करना एक जाल है। यह समझना कहीं अधिक महत्वपूर्ण है कि कौन सी पंक्तियाँ बिना टेस्ट के रह गई हैं और क्यों। इस लेख में, हम रस्ट के लिए तीन मुख्य उपकरणों पर चर्चा करेंगे: tarpaulin, grcov और बिल्ट-इन LLVM टूलकिट। आप सीखेंगे कि कैसे सूखे प्रतिशत को रिफैक्टरिंग के लिए कार्रवाई योग्य अंतर्दृष्टि में बदलें।

\n\n

रस्ट डेवलपर को कवरेज पर नज़र क्यों रखनी चाहिए?

\n

रस्ट अपनी मेमोरी सुरक्षा के लिए प्रसिद्ध है, लेकिन यह तार्किक त्रुटियों को समाप्त नहीं करता है। कोड कवरेज टेस्टिंग मदद करता है:

\n
    \n
  • "डेड कोड" का पता लगाना — ऐसे फ़ंक्शन या शाखाएँ जो कभी कॉल नहीं की जाती हैं।
  • \n
  • रिफैक्टरिंग में आत्मविश्वास बढ़ाना — यह जानकर कि महत्वपूर्ण पथ टेस्ट द्वारा कवर किए गए हैं।
  • \n
  • दस्तावेज़ीकरण में सुधार करना — टेस्ट अक्सर सबसे अच्छा दस्तावेज़ीकरण होते हैं यदि वे सभी परिदृश्यों को कवर करते हैं।
  • \n
\n

मुख्य मीट्रिक line coverage (पंक्तियों का कवरेज) है, लेकिन हम branch coverage (शाखाओं का कवरेज) भी देखेंगे, जो रस्ट में match-अभिव्यक्तियों की प्रचुरता के कारण विशेष रूप से महत्वपूर्ण है।

\n\n

उपकरण #1: cargo-tarpaulin — सरलता और गति

\n

tarpaulin रस्ट में कोड कवरेज के लिए सबसे लोकप्रिय उपकरण है। यह "बॉक्स से बाहर" काम करता है और जटिल सेटअप की आवश्यकता नहीं होती है। इंस्टॉलेशन:

\n
cargo install cargo-tarpaulin
\n

बुनियादी विश्लेषण चलाना:

\n
cargo tarpaulin --out Html
\n

यह कमांड tarpaulin-report.html फ़ोल्डर में एक HTML रिपोर्ट जनरेट करेगा। इसे खोलें — और आप अपने प्रोजेक्ट का एक रंगीन मानचित्र देखेंगे: हरी पंक्तियाँ (टेस्ट द्वारा कवर), लाल (अनकवर्ड) और ग्रे (गैर-कार्यशील, जैसे टिप्पणियाँ)।

\n\n

उदाहरण: एक सरल फ़ंक्शन का परीक्षण

\n

फैक्टोरियल की गणना करने वाले फ़ंक्शन के साथ एक फ़ाइल src/lib.rs बनाएं:

\n
pub fn factorial(n: u32) -> u32 {\n    match n {\n        0 | 1 => 1,\n        _ => n * factorial(n - 1),\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_factorial() {\n        assert_eq!(factorial(0), 1);\n        assert_eq!(factorial(1), 1);\n        assert_eq!(factorial(5), 120);\n    }\n}
\n

tarpaulin चलाएं:

\n
cargo tarpaulin --ignore-tests --out Html
\n

फ़्लैग --ignore-tests रिपोर्ट से टेस्ट कोड को बाहर करता है। परिणाम: इस फ़ंक्शन के लिए 100% कवरेज। लेकिन चलिए कार्य को जटिल बनाते हैं — त्रुटि हैंडलिंग जोड़ें:

\n
pub fn factorial_safe(n: i32) -> Result<u32, String> {\n    if n < 0 {\n        return Err("ऋणात्मक संख्या!".to_string());\n    }\n    Ok(factorial(n as u32))\n}
\n

अब tarpaulin दिखाएगा कि Err शाखा टेस्ट द्वारा कवर नहीं है। एक टेस्ट जोड़ें:

\n
#[test]\nfn test_negative() {\n    assert!(factorial_safe(-5).is_err());\n}
\n

पुनः चलाने के बाद, कवरेज फिर से 100% हो जाएगा।

\n\n

tarpaulin की उन्नत सेटिंग्स

\n

बड़े प्रोजेक्ट्स के लिए उपयोग करें:

\n
    \n
  • --fail-under 80 — यदि कवरेज 80% से कम है तो आपातकालीन निकास।
  • \n
  • --skip-clean — यदि परिवर्तन मामूली हैं तो प्रोजेक्ट को पुनः बिल्ड न करें।
  • \n
  • --engine llvm — LLVM टूलकिट का उपयोग करें (प्रयोगात्मक, लेकिन अधिक सटीक)।
  • \n
\n\n

उपकरण #2: grcov — एकीकरण का राजा

\n

grcov एक अधिक लचीला उपकरण है जो LLVM टूलकिट के साथ काम करता है। यह विशेष रूप से उपयोगी है यदि आप CI/CD (GitHub Actions, GitLab CI, आदि) का उपयोग करते हैं।

ब्लॉग

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