Rust में TDD: विश्वसनीय कोड के लिए टेस्ट-ड्रिवन डेवलपमेंट

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

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

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

Rust में TDD क्यों उबाऊ नहीं, बल्कि फायदेमंद है?

\n\n

क्या आपने कभी ऐसा कोड लिखा है जो "शायद सही" काम कर रहा था, और फिर सबसे अनपेक्षित जगह पर बग पकड़ा? परिचित लगता है। टेस्ट-ड्रिवन डेवलपमेंट (TDD) एक ऐसा तरीका है जो सामान्य प्रक्रिया को उल्टा कर देता है। पहले कोड लिखने और फिर यह सोचने के बजाय कि यह काम करता है या नहीं, आप पहले एक टेस्ट लिखते हैं जो फेल होना चाहिए, और फिर उतना ही कोड लिखते हैं जितना टेस्ट पास करने के लिए ज़रूरी है।

\n\n

Rust एक ऐसी भाषा है जो कंपाइलर स्तर पर ही आपको कई तरह की गलतियों से बचाती है (अलविदा segfaults और डेटा रेस!)। लेकिन कंपाइलर भी यह गारंटी नहीं देता कि आपका लॉजिक सही है। Rust में TDD इस सुरक्षा में एक और परत जोड़ता है: आप सिर्फ कोड नहीं लिखते, बल्कि टेस्ट में अपेक्षित व्यवहार का दस्तावेजीकरण करते हैं। और यह बहुत ही शानदार है।

\n\n

इस लेख में, हम लाइव उदाहरणों के साथ Rust में TDD को समझेंगे। आप देखेंगे कि इम्प्लीमेंटेशन से पहले टेस्ट कैसे लिखें, उन्हें cargo test से कैसे चलाएं, और बिना कुछ तोड़ने के डर के कोड को रिफैक्टर कैसे करें। चलिए शुरू करते हैं!

\n\n

TDD क्या है और Rust इसके लिए आदर्श क्यों है?

\n\n

TDD का मतलब Test-Driven Development (टेस्ट-ड्रिवन डेवलपमेंट) है। इसका चक्र सरल और सुरुचिपूर्ण है:

\n\n
    \n
  1. लाल — एक टेस्ट लिखें जो नई कार्यक्षमता का वर्णन करता है। चलाएं — टेस्ट फेल होता है (तार्किक, कोड अभी तक नहीं है)।
  2. \n
  3. हरा — न्यूनतम कोड लिखें ताकि टेस्ट पास हो जाए। सुंदरता के बारे में न सोचें, सिर्फ टेस्ट पास करने पर ध्यान दें।
  4. \n
  5. रिफैक्टरिंग — कोड को बेहतर बनाएं, उसके व्यवहार को बदले बिना। टेस्ट हरे रहते हैं।
  6. \n
\n\n

Rust कई कारणों से TDD के लिए आदर्श है:

\n
    \n
  • अंतर्निहित टेस्टिंग सिस्टम — cargo test बिना किसी अतिरिक्त फ्रेमवर्क के काम करता है।
  • \n
  • सख्त टाइपिंग — कंपाइलर टाइप की गलतियाँ पकड़ता है, और टेस्ट लॉजिकल गलतियाँ। साथ में ये अजेय हैं।
  • \n
  • स्वामित्व और उधार — टेस्ट यह सुनिश्चित करने में मदद करते हैं कि आप मेमोरी के साथ सही तरीके से काम कर रहे हैं, बिना अनावश्यक कॉपी बनाए।
  • \n
  • समुदाय और दस्तावेज़ीकरण — Rust समुदाय सक्रिय रूप से टेस्टिंग को बढ़ावा देता है, ढेरों उदाहरण उपलब्ध हैं।
  • \n
\n\n

TDD के लिए प्रोजेक्ट सेटअप

\n\n

एक नया प्रोजेक्ट बनाएं:

\n
cargo new tdd_rust_example\ncd tdd_rust_example
\n\n

डिफ़ॉल्ट रूप से, cargo new एक src/main.rs फ़ाइल बनाता है जिसमें एक सरल प्रोग्राम होता है। हम एक लाइब्रेरी लिखेंगे, इसलिए इसे src/lib.rs में बदलें (या बस main.rs हटाकर lib.rs बनाएं)। Cargo.toml में कुछ भी बदलने की ज़रूरत नहीं है — टेस्ट पहले से ही शामिल हैं।

\n\n

वैसे, अगर आप सिर्फ एक लाइब्रेरी (बिना executable फ़ाइल के) लिख रहे हैं, तो cargo new --lib का उपयोग करें।

\n\n

पहला टेस्ट: लाल

\n\n

मान लीजिए कि हम एक फंक्शन लिखना चाहते हैं जो दो संख्याओं को जोड़ता है। TDD के अनुसार, हम पहले टेस्ट लिखते हैं। src/lib.rs खोलें और जोड़ें:

\n\n
#[cfg(test)]\nmod tests {\n    #[test]\n    fn test_add() {\n        let result = add(2, 3);\n        assert_eq!(result, 5);\n    }\n}
\n\n

चलाएं:

\n
cargo test
\n\n

आपको एक कंपाइलेशन एरर दिखेगा — फंक्शन add परिभाषित नहीं है। यह सामान्य है। हम लाल क्षेत्र में हैं।

\n\n

हरा: न्यूनतम इम्प्लीमेंटेशन

\n\n

अब उतना ही कोड लिखें जितना टेस्ट पास करने के लिए ज़रूरी है। टेस्ट मॉड्यूल के ऊपर add फंक्शन जोड़ें:

\n\n
fn add(a: i32, b: i32) -> i32 {\n    a + b\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    \n    #[test]\n    fn test_add() {\n        let result = add(2, 3);\n        assert_eq!(result, 5);\n    }\n}
\n\n

use super::*; पर ध्यान दें — यह पैरेंट मॉड्यूल (हमारा कोड) से सब कुछ टेस्ट मॉड्यूल में इम्पोर्ट करता है।

\n\n

फिर से cargo test चलाएं। हरा! टेस्ट पास हो गया। हमने न्यूनतम किया — योग लौटाया। ऐसा लगता है

ब्लॉग

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