proptest Rust: पूरी गाइड उदाहरणों के साथ

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

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

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

proptest for Rust: प्रॉपर्टी-बेस्ड टेस्टिंग की पूरी गाइड

1. यह क्या है और क्यों ज़रूरी है?

proptest लाइब्रेरी Rust भाषा में प्रॉपर्टी-बेस्ड टेस्टिंग (गुण-आधारित परीक्षण) के लिए एक शक्तिशाली फ्रेमवर्क है। पारंपरिक यूनिट टेस्टिंग के विपरीत, जहाँ आप मैन्युअल रूप से विशिष्ट इनपुट डेटा और अपेक्षित परिणाम सेट करते हैं, प्रॉपर्टी-बेस्ड टेस्टिंग में आप गुणों (इनवेरिएंट) का वर्णन करते हैं जो किसी भी सही इनपुट डेटा के लिए सत्य होने चाहिए। फिर लाइब्रेरी स्वचालित रूप से कई रैंडम टेस्ट केस जनरेट करती है और जाँचती है कि निर्दिष्ट गुण का उल्लंघन तो नहीं हुआ है।

यह क्यों ज़रूरी है? सबसे पहले, यह "एज केसेस" (किनारे के मामले) खोजने में मदद करता है, जिनके बारे में डेवलपर ने सोचा भी नहीं होगा: खाली स्ट्रिंग, नकारात्मक संख्याएँ, बहुत बड़े मान, null जैसी स्थितियाँ। दूसरा, प्रॉपर्टी-बेस्ड टेस्ट स्वयं-दस्तावेज़ीकरण करते हैं: वे फ़ंक्शन के कॉन्ट्रैक्ट का वर्णन करते हैं ("किसी भी संख्या x के लिए, फ़ंक्शन f(x) 0 से बड़ी संख्या लौटाता है"), न कि केवल एक विशिष्ट उदाहरण का। तीसरा, कोड बदलने पर ऐसे टेस्ट अक्सर बिना बदलाव के काम करते रहते हैं, क्योंकि वे सामान्य गुणों की जाँच करते हैं, न कि विशिष्ट मानों की।

proptest QuickCheck (Haskell), Hypothesis (Python) और FsCheck (.NET) लाइब्रेरीज़ का Rust समकक्ष है। यह डेटा जनरेशन के लिए समृद्ध रणनीतियाँ प्रदान करता है (सरल संख्याओं से लेकर जटिल संरचनाओं तक), फेल होने वाले उदाहरणों को छोटा करने के लिए श्रिंकेज मैकेनिज्म, और Rust के मुख्य टेस्टिंग फ्रेमवर्क cargo test के साथ एकीकरण।

2. इंस्टॉलेशन

proptest का उपयोग करने के लिए, इसे अपनी Cargo.toml फ़ाइल के [dev-dependencies] सेक्शन में जोड़ें:

[dev-dependencies]
proptest = "1.4"

फिर यह कमांड चलाएँ:

cargo build

लाइब्रेरी डाउनलोड और कंपाइल हो जाएगी। अब आप इसे अपने टेस्ट मॉड्यूल में उपयोग कर सकते हैं।

3. त्वरित शुरुआत — एक न्यूनतम काम करने वाला उदाहरण

चलिए एक सरल टेस्ट लिखते हैं जो जाँचता है कि reverse फ़ंक्शन (स्ट्रिंग को उल्टा करना) एक इनवोल्यूशन है: यदि इसे दो बार लागू किया जाए, तो हमें मूल स्ट्रिंग मिलती है।

// src/lib.rs
pub fn reverse(s: &str) -> String {
    s.chars().rev().collect()
}

#[cfg(test)]
mod tests {
    use super::*;
    use proptest::prelude::*;

    proptest! {
        #[test]
        fn test_reverse_involution(s in ".*") {
            let reversed = reverse(&s);
            let double_reversed = reverse(&reversed);
            assert_eq!(s, double_reversed);
        }
    }
}

टेस्ट को cargo test कमांड से चलाएँ। proptest डिफ़ॉल्ट रूप से 256 रैंडम स्ट्रिंग जनरेट करेगा और जाँच करेगा कि गुण सत्य है या नहीं। यदि टेस्ट फेल होता है, तो लाइब्रेरी त्रुटि को दोहराने वाला न्यूनतम उदाहरण खोजने का प्रयास करेगी।

4. मुख्य तरीके और फ़ंक्शन

नीचे proptest लाइब्रेरी के प्रमुख घटक दिए गए हैं। सभी उदाहरणों में मान लिया गया है कि टेस्ट मॉड्यूल की शुरुआत में use proptest::prelude::*; जोड़ा गया है।

4.1. मैक्रो proptest!

सिग्नेचर: proptest! { ... }

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

proptest! {
    #[test]
    fn test_addition_commutative(a in 0..100i32, b in 0..100i32) {
        assert_eq!(a + b, b + a);
    }
}

4.2. स्ट्रेटेजी any::<T>()

अनुशंसाएँ