PHP के साथ Docker का एकीकरण परीक्षण: A से Z तक
\n\nआधुनिक PHP विकास गुणवत्ता परीक्षण के बिना अकल्पनीय है। जहाँ यूनिट परीक्षण कोड के अलग-अलग टुकड़ों की जाँच करते हैं, वहीं एकीकरण परीक्षण यह सुनिश्चित करता है कि सिस्टम के सभी घटक एक साथ काम करते हैं: डेटाबेस, Redis, बाहरी API और फ़ाइल सिस्टम। Docker इस प्रक्रिया को पुनरुत्पादनीय, तेज़ और डेवलपर के वातावरण से स्वतंत्र बनाता है। इस लेख में, हम शुरू से Docker का उपयोग करके PHP अनुप्रयोग का एकीकरण परीक्षण सेट करने का तरीका समझेंगे।
\n\nDocker एकीकरण परीक्षणों के लिए आदर्श उपकरण क्यों है?
\n\nएकीकरण परीक्षण की पारंपरिक समस्याएँ:
\n- \n
- वातावरण पर निर्भरता — प्रत्येक डेवलपर के पास MySQL, PHP, Redis का अपना संस्करण होता है। \n
- डेटा प्रदूषण — परीक्षण वास्तविक DB में कचरा छोड़ देते हैं। \n
- समानांतर चलाने में कठिनाई — परीक्षण एक-दूसरे से टकराते हैं। \n
Docker इन समस्याओं को हल करता है:
\n- \n
- प्रत्येक परीक्षण निर्भरताओं के ज्ञात संस्करणों वाले साफ कंटेनर में चलता है। \n
- कंटेनर अलग-थलग होते हैं और चलने के बाद हटा दिए जाते हैं। \n
- Docker Compose एक ही कमांड से पूरे बुनियादी ढाँचे को खड़ा करने की अनुमति देता है। \n
चरण 1: प्रोजेक्ट संरचना और Docker Compose
\n\nहम Symfony पर एक सामान्य PHP अनुप्रयोग से शुरू करते हैं। परीक्षण वातावरण के लिए एक फ़ाइल docker-compose.test.yml बनाएँ:
version: '3.8'\nservices:\n php:\n build:\n context: .\n dockerfile: Dockerfile.test\n environment:\n DATABASE_URL: "mysql://test:test@mysql:3306/test_db?serverVersion=8.0"\n REDIS_URL: "redis://redis:6379"\n depends_on:\n - mysql\n - redis\n\n mysql:\n image: mysql:8.0\n environment:\n MYSQL_ROOT_PASSWORD: root\n MYSQL_DATABASE: test_db\n MYSQL_USER: test\n MYSQL_PASSWORD: test\n tmpfs: /var/lib/mysql # मेमोरी में डेटा — तेज़\n\n redis:\n image: redis:7-alpine\n tmpfs: /data\n\nफ़ाइल Dockerfile.test:
FROM php:8.2-cli\n\nRUN docker-php-ext-install pdo_mysql\nRUN pecl install redis && docker-php-ext-enable redis\n\nCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer\n\nWORKDIR /app\nCOPY . .\n\nRUN composer install --no-interaction --prefer-dist\n\nCMD ["vendor/bin/phpunit", "--configuration", "phpunit.xml.dist"]\n\ntmpfs पर ध्यान दें — यह मेमोरी में एक अस्थायी फ़ाइल सिस्टम माउंट कर रहा है। डेटाबेस और Redis डिस्क की तुलना में कई गुना तेज़ी से काम करेंगे, जो तेज़ परीक्षणों के लिए महत्वपूर्ण है।
चरण 2: एकीकरण परीक्षणों के लिए PHPUnit सेट करना
\n\nएक अलग कॉन्फ़िगरेशन phpunit.integration.xml.dist बनाएँ:
<?xml version="1.0" encoding="UTF-8"?>\n<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"\n bootstrap="tests/bootstrap.php"\n colors="true">\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\nपरीक्षण वातावरण को आरंभ करने के लिए फ़ाइल tests/bootstrap.php:
<?php\n\nrequire dirname(__DIR__) . '/vendor/autoload.php';\n\n// MySQL और Redis के तैयार होने तक प्रतीक्षा करें\n$maxAttempts = 30;\n$connected = false;\n\nfor ($i = 0; $i < $maxAttempts; $i++) {\n try {\n $pdo = new PDO(\n $_ENV['DATABASE_URL'],\n null, null,\n [PDO::ATTR_TIMEOUT => 1]\n );\n $connected = true;\n break;\n } catch (PDOException $e) {\n sleep(1);\n }\n}\n\