आपका यूनिट टेस्ट झूठ बोल रहा है (और आप यह जानते हैं)
\n\nकल्पना करें: आपने 50 यूनिट टेस्ट लिखे, सब हरे, कवरेज 90%। आप खुश हैं। लेकिन एक हफ्ते बाद प्रोडक्शन क्रैश हो जाता है। पता चलता है, आपका SortArray() मेथड [1, 2, 3] और [3, 1, 2] के लिए ठीक काम करता है, लेकिन [int.MaxValue, -1, 0] पर फेल हो जाता है। परिचित लग रहा है?
क्लासिकल यूनिट टेस्ट की समस्या है डेवलपर का पूर्वाग्रह। आप वही टेस्ट लिखते हैं जो डेटा आप उम्मीद करते हैं। हैकर्स, असली यूज़र्स और रैंडम बाउंड्री कंडीशन दूसरे नियमों पर चलते हैं।
\n\nयहाँ आता है C# में प्रॉपर्टी-बेस्ड टेस्टिंग (या प्रॉपर्टी-आधारित परीक्षण)। यह जाँचने के बजाय कि "अगर A, तो B", आप प्रॉपर्टीज़ (गुण) बताते हैं जो हमेशा सही होनी चाहिए। और फ्रेमवर्क खुद सैकड़ों रैंडम इनपुट जनरेट करता है और आपके दावों की जाँच करता है।
\n\nइस लेख में, हम सीखेंगे कि FsCheck लाइब्रेरी के साथ C# में प्रॉपर्टी-बेस्ड टेस्टिंग कैसे लागू करें, असली उदाहरण लिखें, और देखें कि यह उन बग को कैसे पकड़ती है जो सामान्य टेस्ट छोड़ देते हैं।
\n\nप्रॉपर्टी-बेस्ड टेस्टिंग क्या है?
\n\nप्रॉपर्टी-बेस्ड टेस्टिंग एक ऐसा तरीका है जिसमें आप अपने प्रोग्राम के इन्वेरिएंट (अपरिवर्तनीय गुण) बताते हैं। उदाहरण के लिए:
\n- \n
- "सॉर्ट करने के बाद ऐरे की लंबाई नहीं बदलती" \n
- "स्ट्रिंग को उलटने पर फिर उलटने से मूल स्ट्रिंग मिलती है" \n
- "दो धनात्मक संख्याओं का योग हमेशा धनात्मक होता है" \n
फ्रेमवर्क (जैसे FsCheck) दर्जनों और सैकड़ों रैंडम इनपुट जनरेट करता है और जाँचता है कि प्रॉपर्टी सभी के लिए सही है। अगर कोई काउंटर-एग्ज़ाम्पल मिलता है — टेस्ट फेल हो जाता है, और आपको वो सटीक वैल्यू मिलती हैं जिन्होंने कोड तोड़ा।
\n\nयूनिट टेस्ट के विपरीत, आप Assert.AreEqual(3, Add(1,2)) नहीं लिखते। आप Assert(x + y == y + x) लिखते हैं — और हज़ारों संख्याओं के जोड़ों के लिए कम्यूटेटिविटी (क्रम-विनिमय) का परीक्षण करते हैं।
सामान्य यूनिट टेस्ट से अंतर
\n\n| यूनिट टेस्ट | प्रॉपर्टी-बेस्ड टेस्ट |
|---|---|
| खास उदाहरण जाँचते हैं | सामान्य नियम जाँचते हैं |
| डेटा डेवलपर देता है | डेटा फ्रेमवर्क जनरेट करता है |
| बाउंड्री केस छोड़ देते हैं | अपने आप बाउंड्री खोजते हैं |
| पढ़ने में आसान | एब्स्ट्रैक्ट सोच चाहिए |
FsCheck लाइब्रेरी: आपका मुख्य हथियार
\n\nC# की दुनिया में प्रॉपर्टी-बेस्ड टेस्टिंग के लिए डी-फैक्टो स्टैंडर्ड FsCheck है (मूल रूप से Haskell लाइब्रेरी QuickCheck का पोर्ट)। यह xUnit, NUnit और MSTest के साथ इंटीग्रेट होती है।
\n\nइंस्टॉल करना आसान है:
\ndotnet add package FsCheck\ndotnet add package FsCheck.Xunit // xUnit के साथ इंटीग्रेशन के लिए\n\nFsCheck प्रिमिटिव (int, string, float), लिस्ट, ऐरे, टपल और यहाँ तक कि कस्टम टाइप (कस्टम जनरेटर के ज़रिए) के लिए रैंडम डेटा जनरेट कर सकता है।
C# में पहला प्रॉपर्टी-बेस्ड टेस्ट लिखें
\n\nसरल से शुरू करते हैं: जाँचें कि पूर्णांकों का जोड़ कम्यूटेटिव है या नहीं।
\n\nusing FsCheck;\nusing FsCheck.Xunit;\n\npublic class AdditionTests\n{\n [Property]\n public bool Commutative_Addition(int x, int y)\n {\n return x + y == y + x;\n }\n}\n\nटेस्ट चलाएँ। FsCheck 100 रैंडम int जोड़े (डिफ़ॉल्ट रूप से) जनरेट करेगा और प्रॉपर्टी जाँचेगा। अगर कोई काउंटर-एग्ज़ाम्पल नहीं मिलता — टेस्ट हरा है। अगर हमने गलती की (जैसे x - y == y - x लिखा), तो टेस्ट एक खास उदाहरण के साथ फेल होगा: (5, 3) — क्योंकि 5 - 3 != 3 - 5।
कोड को समझें
\n- \n
- [Property] — एट्रीब्यूट जो FsCheck को बताता है कि यह प्रॉपर्टी-बेस्ड टेस्ट है। \n
- मेथड
boolरिटर्न करता है — अगरfalseरिटर्न करता है, टेस्ट फेल होता है। \n - पैरामीटर
int x, int y— FsCheck अपने आप रैंडम वैल्यू डालेगा