PHP के साथ Docker का इंटीग्रेशन टेस्टिंग: उन्नत स्तर
\nइंटीग्रेशन टेस्टिंग विकास का एक महत्वपूर्ण चरण है, विशेष रूप से जटिल PHP एप्लिकेशन के लिए जो डेटाबेस, कतारों, बाहरी API और अन्य सेवाओं के साथ इंटरैक्ट करते हैं। Docker आपको एक अलग वातावरण बनाने की अनुमति देता है, जो प्रोडक्शन के जितना संभव हो उतना करीब होता है, और पुनरुत्पादनीय परिस्थितियों में परीक्षण करने की अनुमति देता है। इस लेख में, हम उन्नत तकनीकों पर चर्चा करेंगे: टेस्ट कंटेनरों का संगठन, बाहरी निर्भरताओं का सिमुलेशन, समानांतर निष्पादन और CI/CD के साथ एकीकरण।
\n\n1. docker-compose के साथ टेस्ट वातावरण की आर्किटेक्चर
\nइंटीग्रेशन टेस्ट के लिए, हम एक अलग docker-compose.test.yml का उपयोग करते हैं जो केवल आवश्यक सेवाओं को शुरू करता है: टेस्ट कोड के साथ PHP-FPM, एक डेटाबेस (उदाहरण के लिए, PostgreSQL), Redis, और वैकल्पिक रूप से, बाहरी API के लिए एक mock-सर्वर।
version: '3.8'\nservices:\n php-test:\n build:\n context: .\n dockerfile: Dockerfile.test\n volumes:\n - .:/var/www/html\n environment:\n DATABASE_URL: "pgsql://test:test@db-test:5432/testdb"\n REDIS_URL: "redis://redis-test:6379"\n EXTERNAL_API_URL: "http://mock-server:1080"\n depends_on:\n - db-test\n - redis-test\n - mock-server\n\n db-test:\n image: postgres:15-alpine\n environment:\n POSTGRES_DB: testdb\n POSTGRES_USER: test\n POSTGRES_PASSWORD: test\n ports:\n - "5433:5432" # मुख्य DB के साथ विरोध से बचें\n\n redis-test:\n image: redis:7-alpine\n ports:\n - "6380:6379"\n\n mock-server:\n image: mockserver/mockserver:latest\n environment:\n MOCKSERVER_PROPERTY_FILE: /config/mockserver.properties\n volumes:\n - ./tests/mockserver:/config\n ports:\n - "1080:1080"\nध्यान दें: हम टेस्ट सेवाओं के लिए अलग पोर्ट का उपयोग करते हैं ताकि वे स्थानीय विकास में बाधा न डालें।
\n\n2. PHPUnit की तैयारी और टेस्ट DB का आरंभीकरण
\nइंटीग्रेशन टेस्ट के लिए phpunit.xml का सेटअप:
<phpunit bootstrap="tests/bootstrap.php">\n <testsuites>\n <testsuite name="Integration">\n <directory>tests/Integration</directory>\n </testsuite>\n </testsuites>\n <php>\n <env name="APP_ENV" value="test"/>\n <env name="KERNEL_CLASS" value="App\\Kernel"/>\n </php>\n</phpunit>\nफ़ाइल tests/bootstrap.php DB स्कीमा के आरंभीकरण और टेस्ट डेटा भरने के लिए जिम्मेदार है:
require __DIR__ . '/../vendor/autoload.php';\n\n// DB स्कीमा बनाएं\n$pdo = new PDO('pgsql:host=db-test;port=5432;dbname=testdb', 'test', 'test');\n$pdo->exec(file_get_contents(__DIR__ . '/../migrations/schema.sql'));\n\n// फिक्स्चर लोड करें\nrequire __DIR__ . '/Fixtures/LoadFixtures.php';\nयह दृष्टिकोण सुनिश्चित करता है कि प्रत्येक टेस्ट रन एक साफ, पूर्वानुमानित स्थिति से शुरू होता है।
\n\n3. बाहरी API के साथ टेस्टिंग: MockServer और WireMock
\nबाहरी HTTP सेवाओं का अनुकरण करने के लिए, हम MockServer (या WireMock) का उपयोग करते हैं। JSON फ़ाइल में अपेक्षाओं का कॉन्फ़िगरेशन बनाएं:
\n// tests/mockserver/expectations/payment.json\n{\n "httpRequest": {\n "method": "POST",\n "path": "/api/v1/charge"\n },\n "httpResponse": {\n "statusCode": 200,\n "body": "{\\"status\\": \\"success\\", \\"transaction_id\\": \\"txn_123\\"}",\n "headers": {\n "Content-Type": "application/json"\n }\n }\n}\nPHP टेस्ट कोड में, हम वास्तविक URL पर एक अनुरोध भेजते हैं, जो पर्यावरण चर के माध्यम से mock-server की ओर इशारा करता है:
\nclass PaymentIntegrationTest extends TestCase\n{\n private PaymentService $paymentService;\n\n protected function setUp(): void\n {\n $this->paymentService = new PaymentService(\n new HttpClient(['base_uri' => $_ENV['EXTERNAL_API_URL']])