PHP में प्रॉपर्टी-आधारित परीक्षण: कोड को लिखने से भी तेज़ तोड़ना

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

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

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

परिचय: आपके टेस्ट झूठ क्यों बोलते हैं और आप उन पर विश्वास क्यों करते हैं

\n\n

कल्पना करें: आपने 50 यूनिट टेस्ट लिखे, सभी if-else को कवर किया, CI से गुजारा — सब हरा है। एक हफ्ते बाद प्रोडक्शन "Division by zero" त्रुटि के साथ क्रैश हो जाता है। कैसे? आखिर टेस्ट तो पास हो रहे थे! परिचित लगता है?

\n\n

क्लासिकल यूनिट टेस्ट (उदाहरणात्मक, विशिष्ट संख्याओं के साथ) की समस्या यह है कि वे वही जांचते हैं जो आप पहले से जानते हैं। आप वे तर्क चुनते हैं जो, आपकी राय में, त्रुटि का कारण बनेंगे। लेकिन प्रोग्रामर का दिमाग पूर्वानुमेय है: हम सभी testDivideByZero लिखते हैं और testDivideByNegativeZero या testDivideByVeryLargeFloat के बारे में भूल जाते हैं।

\n\n

यहाँ पर PHP में प्रॉपर्टी-आधारित परीक्षण आता है — एक ऐसी विधि जो विशिष्ट परिदृश्यों की जाँच नहीं करती, बल्कि हजारों यादृच्छिक इनपुट डेटा के लिए आपके कोड के गुणों को साबित करती है। आज हम चर्चा करेंगे कि कैसे इस दृष्टिकोण को अपने PHP प्रोजेक्ट में Eris और PHPUnit का उपयोग करके शामिल करें। आप सीखेंगे कि कैसे उन बग्स को ढूंढें जिन्हें सामान्य टेस्ट छोड़ देते हैं, और यह जादू नहीं बल्कि इंजीनियरिंग क्यों है।

\n\n

प्रॉपर्टी-आधारित परीक्षण क्या है? (और यह रैंडम क्यों नहीं है)

\n\n

एक सामान्य यूनिट टेस्ट इस तरह दिखता है: assert(2 + 2 === 4)। आप एक विशिष्ट कथन की जाँच करते हैं। प्रॉपर्टी-आधारित परीक्षण (PBT) अलग तरह से काम करता है: आप एक गुण तैयार करते हैं — एक ऐसा कथन जो किसी भी सही इनपुट डेटा के लिए सत्य होना चाहिए।

\n\n

जोड़ फ़ंक्शन के लिए गुण का उदाहरण:

\n
    \n
  • क्रमविनिमेयता: a + b === b + a किसी भी संख्या के लिए।
  • \n
  • इडेम्पोटेंसी: फ़ंक्शन का बार-बार उपयोग परिणाम नहीं बदलता।
  • \n
  • अपरिवर्तनीयता: परिणाम हमेशा सकारात्मक होता है (यदि यह गुण है)।
  • \n
\n\n

PBT सैकड़ों यादृच्छिक मान उत्पन्न करता है (सीमा रेखा, शून्य, ऋणात्मक, NaN सहित) और जाँचता है कि क्या गुण का उल्लंघन हुआ है। यदि कोई प्रतिउदाहरण मिलता है — तो टेस्ट विशिष्ट इनपुट डेटा के साथ विफल हो जाता है जिसने खराबी पैदा की। आपको केवल "टेस्ट फेल" नहीं, बल्कि एक पुनरुत्पादनीय बग मिलता है।

\n\n

PHP में, यह तकनीक डायनामिक टाइपिंग के कारण विशेष रूप से उपयोगी है: आप कभी नहीं जानते कि वास्तव में फ़ंक्शन में कौन सा टाइप आएगा।

\n\n

PHP में प्रॉपर्टी-आधारित परीक्षण के लिए उपकरण

\n\n

मुख्य उपकरण Eris लाइब्रेरी है (github.com/giorgiosironi/eris)। यह PHPUnit के साथ एकीकृत होती है और यादृच्छिक डेटा जनरेटर प्रदान करती है। विकल्प — PHPUnit 10+ की अंतर्निहित क्षमताएँ (लेकिन वे अभी भी कच्ची हैं)। हम Eris का उपयोग करेंगे, क्योंकि यह एक परिपक्व और दस्तावेजीकृत उपकरण है।

\n\n

Composer के माध्यम से स्थापना:

\n
composer require --dev giorgiosironi/eris
\n\n

जटिल संरचनाएँ (ईमेल, नाम, पते) उत्पन्न करने के लिए Faker भी काम आएगा।

\n\n
composer require --dev fakerphp/faker
\n\n

पहला प्रॉपर्टी-आधारित टेस्ट लिखना: सॉर्टिंग को तोड़ना

\n\n

मान लीजिए, हमारे पास एक फ़ंक्शन sortArray() है जो quicksort का उपयोग करता है। हम एक गुण लिखते हैं: "सॉर्टिंग के बाद ऐरे में पिछले तत्व से छोटा कोई तत्व नहीं होना चाहिए"।

\n\n
use Eris\\TestTrait;\nuse Eris\\Generator\\IntegerGenerator;\nuse PHPUnit\\Framework\\TestCase;\n\nclass SortTest extends TestCase\n{\n    use TestTrait;\n\n    public function testSortedArrayProperty(): void\n    {\n        $this->forAll(\n            Generator\\seq(Generator\\int())\n        )->then(function (array $input) {\n            $sorted = sortArray($input);\n            for ($i = 0; $i < count($sorted) - 1; $i++) {\n                $this->assertLessThanOrEqual(\n                    $sorted[$i + 1],\n                    $sorted[$i],\n                    "ऐरे सॉर्ट नहीं हुआ: " . json_encode($sorted)\n                );\n            }\n        });\n    }\n}\n
\n\n

चलाएँ

ब्लॉग

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