PHP डेवलपर्स के लिए TDD मानक क्यों बन गया?
\nकल्पना करें: आप कोड लिखते हैं, उसे चलाते हैं, एक त्रुटि देखते हैं, उसे ठीक करते हैं — और यह चक्र चलता रहता है। परिचित लगता है? अब कल्पना करें कि आप पहले एक टेस्ट लिखते हैं जो निश्चित रूप से विफल होगा, फिर उसे पास करने के लिए न्यूनतम कोड लिखते हैं, और उसके बाद ही रिफैक्टर करते हैं। यही है TDD in PHP — टेस्ट-ड्रिवेन डेवलपमेंट, जो अराजकता को एक व्यवस्थित प्रणाली में बदल देता है।
\nकई डेवलपर TDD से डरते हैं: "इससे डेवलपमेंट धीमा हो जाएगा!", "मुझे नहीं पता कि लीगेसी कोड का परीक्षण कैसे करूं", "PHPUnit जटिल है"। लेकिन व्यवहार में, TDD डिबगिंग के घंटे बचाता है और कोड को बदलावों के प्रति लचीला बनाता है। इस लेख में, हम वास्तविक PHP उदाहरणों के साथ TDD को समझेंगे, दिखाएंगे कि "रेड-ग्रीन-रिफैक्टरिंग" चक्र कैसे काम करता है, और इसे लागू करने के लिए तैयार टेम्पलेट देंगे।
\n\nTDD क्या है और यह PHP में कैसे काम करता है?
\nटेस्ट-ड्रिवेन डेवलपमेंट (Test-Driven Development) एक पद्धति है जहाँ टेस्ट को कार्यान्वयन से पहले लिखा जाता है। मुख्य चक्र इस प्रकार है:
\n- \n
- लाल (Red) — हम एक टेस्ट लिखते हैं जो पास नहीं होता (त्रुटि की उम्मीद करते हैं)। \n
- हरा (Green) — हम न्यूनतम कोड लिखते हैं ताकि टेस्ट पास हो जाए। \n
- रिफैक्टरिंग (Refactoring) — हम व्यवहार बदले बिना कोड में सुधार करते हैं। \n
PHP में TDD के लिए आमतौर पर PHPUnit का उपयोग किया जाता है — यूनिट टेस्टिंग के लिए एक शक्तिशाली फ्रेमवर्क। लेकिन TDD उपकरणों के बारे में नहीं है, बल्कि अनुशासन के बारे में है। आइए देखें कि यह व्यवहार में कैसे काम करता है।
उदाहरण 1: एक सरल कैलकुलेटर का परीक्षण
\nमान लीजिए, हमें दो संख्याओं को जोड़ने के लिए एक फंक्शन चाहिए। TDD के बिना, हम लिखते:
\nfunction add($a, $b) {\n return $a + $b;\n}\necho add(2, 3); // 5\nTDD के साथ, हम पहले टेस्ट लिखते हैं:
\nuse PHPUnit\\Framework\\TestCase;\n\nclass CalculatorTest extends TestCase {\n public function testAdd() {\n $calculator = new Calculator();\n $result = $calculator->add(2, 3);\n $this->assertEquals(5, $result);\n }\n}\nचलाते हैं — टेस्ट विफल होता है (लाल)। न्यूनतम कार्यान्वयन लिखते हैं:
\nclass Calculator {\n public function add($a, $b) {\n return $a + $b;\n }\n}\nटेस्ट पास हो जाता है (हरा)। रिफैक्टरिंग की आवश्यकता नहीं है — कोड सरल है। लेकिन अगर हम ऋणात्मक संख्याओं को संभालना चाहते, तो पहले उस मामले के लिए टेस्ट लिखते।
\n\nउदाहरण 2: डेटाबेस के साथ काम करने के लिए TDD
\nअक्सर कहा जाता है: "TDD डेटाबेस के लिए उपयुक्त नहीं है"। यह एक मिथक है। मॉक (mocks) और टेस्ट डेटाबेस का उपयोग करें। UserRepository के साथ एक उदाहरण देखें:
\nclass UserRepositoryTest extends TestCase {\n public function testFindUserById() {\n $pdoMock = $this->createMock(PDO::class);\n $stmtMock = $this->createMock(PDOStatement::class);\n \n $pdoMock->method('prepare')\n ->willReturn($stmtMock);\n $stmtMock->method('fetch')\n ->willReturn(['id' => 1, 'name' => 'Alex']);\n \n $repository = new UserRepository($pdoMock);\n $user = $repository->findById(1);\n \n $this->assertEquals('Alex', $user['name']);\n }\n}\nटेस्ट जाँचता है कि रिपॉजिटरी सही ढंग से SQL को कॉल करता है और परिणाम को संसाधित करता है। कार्यान्वयन कोड न्यूनतम होगा: बस क्वेरी निष्पादित करें और डेटा लौटाएँ।
\n\nPHP में TDD के लिए लोकप्रिय उपकरण
\nTDD को अपने वर्कफ़्लो का हिस्सा बनाने के लिए, कुछ उपकरणों में महारत हासिल करनी होगी:
\n- \n
- PHPUnit — टेस्ट के लिए मुख्य फ्रेमवर्क। इंस्टॉलेशन:
composer require --dev phpunit/phpunit। \n - Mockery — लचीले API के साथ मॉक बनाने के लिए लाइब्रेरी। \n
- Prophecy — Mockery का विकल्प, अक्सर Symfony के साथ उपयोग किया जाता है। \n
- PHPStan / Psalm — स्टैटिक एनालिसिस, जो टेस्ट चलाने से पहले त्रुटियाँ ढूँढकर TDD को पूरक बनाता है। \n
इंटीग्रेशन टेस्ट के लिए Laravel Dusk या Symfony Panther का उपयोग किया जा सकता है, लेकिन शुरुआत के लिए पर्याप्त है।