PHP में परीक्षण: उन्नत स्तर पर यूनिट, इंटीग्रेशन, E2E

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

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

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

PHP में परीक्षण: उन्नत स्तर पर यूनिट, इंटीग्रेशन, E2E

\n\n

आधुनिक PHP वेब डेवलपमेंट में, कोड की गुणवत्ता एक विकल्प नहीं रह गई है - यह प्रोजेक्ट के अस्तित्व के लिए एक अनिवार्य शर्त है। बुनियादी यूनिट परीक्षण हर डेवलपर से परिचित हैं, लेकिन जैसे ही कोई प्रोजेक्ट "Hello World" की सीमाओं को पार करता है, अधिक जटिल दृष्टिकोणों की आवश्यकता उत्पन्न होती है: इंटीग्रेशन परीक्षण, घटकों के बीच बातचीत की जाँच, और उपयोगकर्ता परिदृश्यों (E2E) का एंड-टू-एंड परीक्षण।

\n\n

यह लेख मिडिल और उससे ऊपर के PHP डेवलपर्स के लिए है, जो पहले से PHPUnit से परिचित हैं और अपने ज्ञान को गहरा करना चाहते हैं। हम उन्नत तकनीकों पर चर्चा करेंगे: बाहरी निर्भरताओं के साथ परीक्षण, टेस्ट कंटेनरों के साथ काम करना, इंफ्रास्ट्रक्चर को अलग करना और एक संपूर्ण परीक्षण रणनीति का निर्माण करना।

\n\n

1. उन्नत यूनिट-टेस्टिंग: मॉक-ऑब्जेक्ट और स्टब-स्टब्स

\n\n

उन्नत स्तर पर, यूनिट परीक्षण केवल गणितीय कार्यों की जाँच करने तक सीमित नहीं रह जाते। वे बाहरी दुनिया से अलग व्यावसायिक तर्क का परीक्षण करते हैं। मुख्य उपकरण हैं Mock और Stub।

\n\n

Stub पूर्वनिर्धारित डेटा लौटाता है। Mock जाँचता है कि विधियों को कैसे कॉल किया गया (कॉल की संख्या, तर्कों का क्रम)।

\n\n

एक उदाहरण पर विचार करें: भुगतान सेवा जो भुगतान गेटवे को अनुरोध भेजती है।

\n\n
<?php\nclass PaymentService {\n    public function __construct(\n        private PaymentGatewayInterface $gateway,\n        private LoggerInterface $logger\n    ) {}\n\n    public function processPayment(Order $order): bool {\n        $result = $this->gateway->charge(\n            $order->getAmount(),\n            $order->getCurrency()\n        );\n\n        if ($result->isSuccess()) {\n            $this->logger->info('Payment processed', ['order_id' => $order->getId()]);\n            return true;\n        }\n\n        $this->logger->warning('Payment failed', ['error' => $result->getError()]);\n        return false;\n    }\n}\n\n// PHPUnit का उपयोग करके परीक्षण\nclass PaymentServiceTest extends TestCase {\n    public function testSuccessfulPaymentLogsInfo(): void {\n        // गेटवे के लिए Stub बनाएं\n        $gatewayStub = $this->createStub(PaymentGatewayInterface::class);\n        $gatewayStub->method('charge')\n            ->willReturn(new PaymentResult(true));\n\n        // लॉगर के लिए Mock बनाएं (कॉल की जाँच करें)\n        $loggerMock = $this->createMock(LoggerInterface::class);\n        $loggerMock->expects($this->once())\n            ->method('info')\n            ->with('Payment processed', $this->arrayHasKey('order_id'));\n\n        $service = new PaymentService($gatewayStub, $loggerMock);\n        $result = $service->processPayment(new Order(100, 'USD'));\n\n        $this->assertTrue($result);\n    }\n}\n
\n\n

उन्नत तकनीक: डायनामिक प्रतिक्रियाओं के लिए willReturnCallback() और कॉल के अनुक्रम की जाँच के लिए withConsecutive() का उपयोग करें।

\n\n

2. इंटीग्रेशन परीक्षण: डेटाबेस और बाहरी API

\n\n

इंटीग्रेशन परीक्षण जाँचते हैं कि आपका कोड वास्तविक घटकों के साथ कैसे इंटरैक्ट करता है: डेटाबेस, फ़ाइल सिस्टम, कैश। यहाँ मॉक पर निर्भर नहीं रहा जा सकता - वास्तविक इंफ्रास्ट्रक्चर की आवश्यकता है।

\n\n

समस्या: परीक्षण धीमे और नाजुक हो जाते हैं। समाधान: टेस्ट कंटेनर (Testcontainers) या अंतर्निहित SQLite डेटाबेस का उपयोग करें।

\n\n

Doctrine के साथ उपयोगकर्ता रिपॉजिटरी के लिए इंटीग्रेशन परीक्षण का उदाहरण:

\n\n
<?php\nclass UserRepositoryIntegrationTest extends KernelTestCase {\n    private EntityManagerInterface $entityManager;\n    private UserRepository $repository;\n\n    protected function setUp(): void {\n        self::bootKernel();\n        $this->entityManager = self::$kernel->getContainer()\n            ->get('doctrine                

ब्लॉग

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