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

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

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

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

Proptest क्या है और इसकी आवश्यकता क्यों है?

Proptest Rust भाषा के लिए एक शक्तिशाली property-based testing (गुण-आधारित परीक्षण) लाइब्रेरी है। पारंपरिक unit-testing में आप मैन्युअल रूप से विशिष्ट इनपुट और अपेक्षित आउटपुट सेट करते हैं, जबकि property-based testing में आप गुण (properties) परिभाषित करते हैं जिन्हें आपका प्रोग्राम सभी सही इनपुट के लिए पूरा करना चाहिए। लाइब्रेरी स्वचालित रूप से कई रैंडम टेस्ट केस जनरेट करती है और जांचती है कि निर्धारित गुण पूरे होते हैं या नहीं।

इसकी आवश्यकता क्यों है?

  • छिपे हुए बग्स का पता लगाना: रैंडम डेटा अक्सर ऐसे edge cases ढूंढ लेता है जिनके बारे में डेवलपर ने सोचा भी नहीं होता।
  • टेस्ट कोड की मात्रा कम करना: दर्जनों उदाहरण लिखने के बजाय, आप एक ही गुण लिखते हैं।
  • स्वचालित न्यूनीकरण (shrinking): अगर टेस्ट फेल होता है, तो Proptest स्वचालित रूप से न्यूनतम इनपुट ढूंढने की कोशिश करता है जो एरर को दोहराता है।
  • स्पेसिफिकेशन का दस्तावेजीकरण: गुण कोड के व्यवहार के बारे में औपचारिक, सत्यापन योग्य कथन हैं।

Proptest Haskell की QuickCheck लाइब्रेरी से प्रेरित है, लेकिन इसे Rust की विशेषताओं जैसे ownership, borrowing और traits के अनुसार अनुकूलित किया गया है।

इंस्टॉलेशन

Proptest एक Rust लाइब्रेरी है, इसलिए इसे Cargo पैकेज मैनेजर के माध्यम से इंस्टॉल किया जाता है। इसे अपनी Cargo.toml फ़ाइल के [dev-dependencies] सेक्शन में जोड़ें:

[dev-dependencies]
proptest = "1.4"

इसके बाद, लाइब्रेरी को डाउनलोड और कंपाइल करने के लिए cargo build या cargo test कमांड चलाएँ। Proptest का उपयोग केवल टेस्टिंग के दौरान होता है, इसलिए यह आपके फाइनल बाइनरी के आकार को नहीं बढ़ाता।

एसिंक्रोनस कोड (tokio, async-std) के लिए अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता हो सकती है, लेकिन अधिकांश मामलों में मानक इंस्टॉलेशन पर्याप्त है।

कोड उदाहरण के साथ त्वरित शुरुआत

आइए एक सरल टेस्ट लिखें जो जाँचता है कि 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);
            prop_assert_eq!(s, double_reversed);
        }
    }
}

टेस्ट चलाएँ: cargo test. Proptest 256 रैंडम स्ट्रिंग (डिफ़ॉल्ट) जनरेट करेगा और जाँच करेगा कि गुण पूरा होता है या नहीं। अगर टेस्ट फेल होता है, तो आपको न्यूनतम रिप्रोड्यूसिंग उदाहरण के साथ एक संदेश दिखाई देगा।

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

नीचे Proptest के प्रमुख घटक दिए गए हैं। प्रत्येक के लिए विवरण, पैरामीटर और उदाहरण दिया गया है।

1. proptest! — टेस्ट परिभाषित करने के लिए मैक्रो

विवरण: मुख्य मैक्रो जो property-based टेस्ट चलाता है। यह टेस्ट फ़ंक्शन वाले ब्लॉक को स्वीकार करता है और स्वचालित रूप से इनपुट डेटा जनरेट करता है।

पैरामीटर: मैक्रो के अंदर, आप #[test] एट्रीब्यूट वाले टेस्ट परिभाषित करते हैं। इनपुट डेटा param in strategy के रूप में दिया जाता है।

उदाहरण:

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

2. prop_assert! और prop_assert_eq! — एसर्शन

विवरण: मानक assert! और assert_eq! के समान, लेकिन Proptest के लिए अनुकूलित। ये टेस्ट फेल होने पर विस्तृत जानकारी प्रदान करते हैं।

अनुशंसाएँ