परिचय: PHP में परीक्षण क्यों एक विकल्प नहीं, बल्कि एक मानक है
आधुनिक PHP-डेवलपमेंट में, परीक्षण बहुत पहले ही 'अच्छा व्यवहार' नहीं रह गया है और यह प्रोडक्शन प्रोजेक्ट्स का एक अनिवार्य चरण बन गया है। कोड को परीक्षणों से कवर किए बिना, आप प्रोडक्शन में एक त्रुटि जारी करने का जोखिम उठाते हैं जो व्यवसाय को पैसे और प्रतिष्ठा दोनों खर्च कर सकती है। इस लेख में, हम परीक्षण के तीन स्तरों पर चर्चा करेंगे: यूनिट (मॉड्यूलर), इंटीग्रेशन (एकीकरण) और e2e (एंड-टू-एंड)। आप जानेंगे कि वे कैसे भिन्न हैं, किन उपकरणों का उपयोग करना है (PHPUnit, Pest, Laravel Dusk, Codeception) और अपने PHP-प्रोजेक्ट के लिए सही परीक्षण रणनीति कैसे बनाएं।
1. यूनिट-टेस्ट: कोड की पृथक इकाइयों का परीक्षण
यूनिट-टेस्ट बाहरी निर्भरताओं (DB, API, फ़ाइल सिस्टम) से अलग करके अलग-अलग क्लास, फ़ंक्शन या मेथड के काम की जाँच करते हैं। यह सबसे तेज़ और सस्ता प्रकार का परीक्षण है। PHP में मुख्य उपकरण PHPUnit (वास्तविक मानक) और इसका 'फैशनेबल' विकल्प Pest है।
1.1. PHPUnit के साथ स्थापना और पहला परीक्षण
Composer के माध्यम से PHPUnit स्थापित करें:
composer require --dev phpunit/phpunitएक सरल कैलकुलेटर क्लास के लिए परीक्षण बनाएं:
<?php// src/Calculator.phpclass Calculator { public function add(int $a, int $b): int { return $a + $b; }}
// tests/CalculatorTest.phpuse PHPUnit\\Framework\\TestCase;
class CalculatorTest extends TestCase { public function testAddition(): void { $calc = new Calculator(); $result = $calc->add(2, 3); $this->assertEquals(5, $result); }}परीक्षण चलाएं:
./vendor/bin/phpunit tests1.2. Mock-ऑब्जेक्ट का उपयोग
परीक्षण किए जा रहे क्लास को अलग करने के लिए, हम मॉक का उपयोग करके इसकी निर्भरताओं को 'बदल' देते हैं। उपयोगकर्ता रिपॉजिटरी के साथ उदाहरण:
<?phpclass UserService { private UserRepository $repo; public function __construct(UserRepository $repo) { $this->repo = $repo; } public function getUserName(int $id): string { $user = $this->repo->findById($id); return $user ? $user->getName() : 'Guest'; }}
// परीक्षण में$mockRepo = $this->createMock(UserRepository::class);$mockRepo->method('findById') ->with(1) ->willReturn(new User('Alice'));
$service = new UserService($mockRepo);$this->assertEquals('Alice', $service->getUserName(1));Best practice: सभी व्यावसायिक तर्क के लिए यूनिट-टेस्ट लिखें। उन्हें सेकंडों में निष्पादित होना चाहिए और पर्यावरण पर निर्भर नहीं होना चाहिए।
2. इंटीग्रेशन-टेस्ट: DB, API और बाहरी सेवाओं के साथ इंटरैक्शन की जाँच
इंटीग्रेशन टेस्ट जाँचते हैं कि आपकी क्लास वास्तविक घटकों: डेटाबेस, कैश, बाहरी HTTP सेवाओं के साथ कैसे काम करती हैं। वे यूनिट-टेस्ट की तुलना में धीमे होते हैं, लेकिन यह अधिक आश्वासन देते हैं कि सिस्टम एक इकाई के रूप में काम करता है।
2.1. डेटाबेस के साथ काम करने का परीक्षण (Laravel + RefreshDatabase)
यदि आप Laravel का उपयोग कर रहे हैं, तो RefreshDatabase ट्रेट के कारण इंटीग्रेशन टेस्ट बहुत सरल हो जाते हैं:
<?phpnamespace Tests\\Feature;
use Tests\\TestCase;use Illuminate\\Foundation\\Testing\\RefreshDatabase;
class UserRegistrationTest extends TestCase { use RefreshDatabase;
public function test_user_can_register(): void { $response = $this->post('/register', [ 'name' => 'John', 'email' => 'john@example.com', 'password' => 'secret123', ]);
$response->assertStatus(302); // सफलता के बाद रीडायरेक्ट $this->assertDatabaseHas('users', [ 'email' => 'john@example.com' ]); }}RefreshDatabase ट्रेट परीक्षणों से पहले स्वचालित रूप से DB को माइग्रेट करता है और