PHP में म्यूटेशन टेस्टिंग: टेस्ट को मारना ताकि वे काम करें

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

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

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

क्या आपके टेस्ट सुरक्षा का भ्रम हैं?

\n\n

कल्पना करें: आपके पास 95% कोड कवरेज है, सभी टेस्ट ग्रीन हैं, CI/CD पास हो रहा है। आपको विश्वास है कि आपका PHP कोड रिग्रेशन से सुरक्षित है। लेकिन क्या वास्तव में ऐसा है?

\n\n

मैं खुद लंबे समय तक इस भ्रम में रहा, जब तक कि मुझे एक स्थिति का सामना नहीं करना पड़ा: टेस्ट पास हो रहा था, जबकि मैंने गलती से एक महत्वपूर्ण शर्त में && को || से बदल दिया था। टेस्ट उस शाखा की जाँच ही नहीं कर रहा था। कवरेज 100% था, लेकिन लॉजिक नहीं।

\n\n

मिलिए: म्यूटेशन टेस्टिंग (mutation testing) — एक ऐसी तकनीक जो बेरहमी से आपके टेस्ट को "मार" देती है, ताकि यह पता चल सके कि वे वास्तव में कितने विश्वसनीय हैं। इस लेख में, हम जानेंगे कि इसे PHP में कैसे लागू किया जाए, शक्तिशाली टूल Infection का उपयोग करके, और यह खेल के नियमों को क्यों बदलता है।

\n\n

म्यूटेशन टेस्टिंग क्या है और इसकी आवश्यकता क्यों है?

\n\n

म्यूटेशन टेस्टिंग एक ऐसा दृष्टिकोण है जिसमें आपके स्रोत कोड में छोटे जानबूझकर बदलाव (म्यूटेशन) किए जाते हैं। उदाहरण के लिए, ऑपरेटर + को - में बदल दिया जाता है, true को false में, या एक पूरी लाइन हटा दी जाती है। प्रत्येक म्यूटेशन के बाद, आपके टेस्ट चलाए जाते हैं।

\n\n

यदि टेस्ट फेल होता है — म्यूटेशन "मारा" गया, जिसका अर्थ है कि टेस्ट वास्तव में कोड के इस हिस्से की जाँच कर रहा है। यदि टेस्ट पास होता है — म्यूटेशन "बच गया"। यह एक चेतावनी संकेत है: या तो टेस्ट इस शर्त की जाँच नहीं कर रहा है, या वह गलत तरीके से लिखा गया है।

\n\n

"कोड कवरेज" (code coverage) मीट्रिक के विपरीत, जो केवल यह दिखाता है कि कौन सी लाइनें निष्पादित हुईं, म्यूटेशन टेस्टिंग जाँच की गुणवत्ता की जाँच करता है। उच्च कवरेज प्रतिशत कोई गारंटी नहीं है, जबकि म्यूटेशन स्कोर इंडिकेटर (MSI) विश्वसनीयता का वास्तविक संकेतक है।

\n\n

PHP डेवलपर के लिए यह क्यों महत्वपूर्ण है?

\n
    \n
  • "मृत" टेस्ट का पता लगाना — वे टेस्ट जो हमेशा ग्रीन रहते हैं लेकिन कुछ भी जाँच नहीं करते।
  • \n
  • लॉजिक में कमियों का पता लगाना — उदाहरण के लिए, छूटी हुई सीमा शर्तें।
  • \n
  • रीफैक्टरिंग के दौरान आत्मविश्वास बढ़ाना — आपको ठीक-ठीक पता होता है कि कौन से टेस्ट कोड की रक्षा कर रहे हैं।
  • \n
  • समय की बचत — टेस्ट के मैन्युअल ऑडिट के बजाय, आपको एक स्वचालित रिपोर्ट मिलती है।
  • \n
\n\n

PHP में म्यूटेशन टेस्टिंग के लिए उपकरण

\n\n

PHP क्षेत्र में अग्रणी Infection है (पहले Humbug के नाम से जाना जाता था)। यह PHPUnit और Pest के साथ आसानी से एकीकृत होता है, कई म्यूटेशन का समर्थन करता है और स्पष्ट रिपोर्ट देता है।

\n\n

अन्य विकल्प: Humbug (पूर्वज, लेकिन कम सक्रिय) और Mutagen (प्रयोगात्मक)। हम Infection पर ध्यान केंद्रित करेंगे — यह आधुनिक मानक है।

\n\n

अभ्यास: प्रोजेक्ट में Infection सेट करना

\n\n

आइए Infection स्थापित करें और इसे एक वास्तविक उदाहरण पर चलाएँ। मान लीजिए, हमारे पास छूट की गणना के लिए एक सरल क्लास है:

\n\n
<?php\n// src/DiscountCalculator.php\nclass DiscountCalculator\n{\n    public function calculate(float $price, bool $isPremium): float\n    {\n        if ($isPremium) {\n            return $price * 0.9; // 10% की छूट\n        }\n\n        return $price;\n    }\n}\n
\n\n

और इसके लिए टेस्ट:

\n\n
<?php\n// tests/DiscountCalculatorTest.php\nuse PHPUnit\\Framework\\TestCase;\n\nclass DiscountCalculatorTest extends TestCase\n{\n    public function testPremiumDiscount(): void\n    {\n        $calculator = new DiscountCalculator();\n        $result = $calculator->calculate(100.0, true);\n        $this->assertEquals(90.0, $result);\n    }\n\n    public function testRegularPrice(): void\n    {\n        $calculator = new DiscountCalculator();\n        $result = $calculator->calculate(100.0, false);\n        $this->assertEquals(100.0, $result);\n    }\n}\n
\n\n

कवरेज — 100%। लेकिन आइए म्यूटेशन से जाँच करें।

\n\n

Infection की स्थापना और चलाना

\n\n
composer require --dev infection/infection\n./vendor/bin/infection\n
\n\n

बाद में

ब्लॉग

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