Java में Property-based Testing: कोड को JUnit से भी तेज़ तोड़ें

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

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

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

Java में Property-based Testing: जब एक टेस्ट हजारों की जगह ले लेता है

\n\n

क्या आपने कभी कोई यूनिट टेस्ट लिखा है जो ग्रीन पास हुआ, लेकिन एक हफ्ते बाद प्रोडक्शन में "किसी अजीब वैल्यू" पर फेल हो गया? यह आम बात है। सामान्य (example-based) टेस्टिंग ऐसी है जैसे केतली को सिर्फ 100°C पर ही उबलने की जांच करना। क्या होगा अगर प्रेशर अलग हो? या समुद्र तल से ऊंचाई अलग हो? Java में Property-based Testing इसी समस्या को हल करता है: मैन्युअली उदाहरण देने के बजाय, आप उन गुणों (properties) को परिभाषित करते हैं जिन्हें आपका कोड पूरा करना चाहिए, और फ्रेमवर्क सैकड़ों रैंडम इनपुट जनरेट करके जांचता है कि सब कुछ सही है या नहीं।

\n\n

यह तरीका विशेष रूप से उन Java डेवलपर्स के लिए उपयोगी है जो जटिल एल्गोरिदम, कलेक्शन, पार्सर या गणितीय फंक्शन पर काम करते हैं। इस लेख में, हम jqwik लाइब्रेरी की मदद से आपके प्रोजेक्ट में property-based testing को शामिल करने का तरीका और वास्तविक कोड उदाहरण देखेंगे।

\n\n

Property-based Testing क्या है और यह सामान्य टेस्टिंग से कैसे अलग है?

\n\n

पारंपरिक तरीके में आप लिखते हैं:

\n\n
@Test\nvoid testAddition() {\n    assertEquals(4, Calculator.add(2, 2));\n    assertEquals(0, Calculator.add(-1, 1));\n}
\n\n

यह तब तक ठीक है जब तक कोई Integer.MAX_VALUE या null या बहुत बड़ी नेगेटिव संख्या नहीं देता। Property-based Testing तर्क को उलट देता है: आप यह नहीं कहते "मुझे यह रिजल्ट चाहिए", बल्कि कहते हैं "किसी भी सही इनपुट के लिए, रिजल्ट को गुण X को संतुष्ट करना चाहिए"।

\n\n

उदाहरण के लिए, जोड़ के लिए एक गुण: add(a, b) == add(b, a) (कम्यूटेटिविटी)। या add(a, 0) == a (न्यूट्रल एलिमेंट)। फ्रेमवर्क हजारों रैंडम a और b जोड़े जनरेट करता है और जांचता है कि गुण का उल्लंघन तो नहीं हुआ।

\n\n

Property-based Testing के मुख्य लाभ:

\n
    \n
  • ऑटोमैटिक टेस्ट डेटा जनरेशन — आप उन बग्स को ढूंढते हैं जिनके बारे में आपने सोचा भी नहीं था।
  • \n
  • टेस्ट की संख्या कम होना — एक property-टेस्ट दर्जनों example-based टेस्ट की जगह ले लेता है।
  • \n
  • बाउंड्री केस की जांच — जनरेटर "खतरनाक" वैल्यू (0, null, खाली स्ट्रिंग, बड़ी संख्याएं) बनाने में सक्षम हैं।
  • \n
  • Shrinking — अगर टेस्ट फेल होता है, तो फ्रेमवर्क इनपुट डेटा को सबसे सरल उदाहरण तक कम कर देता है जिस पर एरर रिप्रोड्यूस होती है।
  • \n
\n\n

Java में Property-based Testing के लिए लाइब्रेरीज़

\n\n

बाजार में कई परिपक्व समाधान उपलब्ध हैं:

\n
    \n
  • jqwik — आधुनिक, हल्का, JUnit 5 के साथ बेहतरीन इंटीग्रेशन। शुरुआत के लिए अनुशंसित।
  • \n
  • QuickTheories — तेज़, लेकिन कम लोकप्रिय।
  • \n
  • JUnit QuickCheck — पुराने Scala टूल का फोर्क, लेकिन सपोर्ट कमज़ोर है।
  • \n
\n\n

हम jqwik का उपयोग करेंगे क्योंकि इसका API सबसे सुविधाजनक है और डॉक्यूमेंटेशन बहुत अच्छा है। pom.xml में डिपेंडेंसी जोड़ें:

\n\n
<dependency>\n    <groupId>net.jqwik</groupId>\n    <artifactId>jqwik</artifactId>\n    <version>1.8.4</version>\n    <scope>test</scope>\n</dependency>
\n\n

या Gradle के लिए:

\n\n
testImplementation 'net.jqwik:jqwik:1.8.4'
\n\n

Java में पहला Property-based टेस्ट लिखना

\n\n

मान लीजिए हमारे पास एक मेथड है जो स्ट्रिंग को रिवर्स करता है:

\n\n
public static String reverse(String s) {\n    if (s == null) return null;\n    return new StringBuilder(s).reverse().toString();\n}
\n\n

किस गुण की जांच की जा सकती है? अगर स्ट्रिंग को दो बार रिवर्स किया जाए, तो हमें मूल स्ट्रिंग मिलनी चाहिए। यह property-based testing के लिए एक आदर्श गुण है।

\n\n
import net.jqwik.api.*;\nimport static org.assertj.core.api.Assertions.assertThat;\n\nclass StringProperties {\n                

ब्लॉग

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