परिचय: Docker में PHP एकीकरण परीक्षण क्यों आवश्यक है
आधुनिक PHP अनुप्रयोगों का विकास शायद ही कभी एक सर्वर तक सीमित होता है। डेटाबेस, कैश (Redis, Memcached), कतारें (RabbitMQ), बाहरी API - इन सभी को घटकों के बीच परस्पर क्रिया की जाँच की आवश्यकता होती है। यूनिट परीक्षण कोड को अलग करते हैं, लेकिन यह गारंटी नहीं देते कि क्लास A वास्तविक डेटाबेस के माध्यम से क्लास B के साथ सही ढंग से काम करता है। यहाँ एकीकरण परीक्षण मदद करता है।
पारंपरिक दृष्टिकोण की समस्या पर्यावरण सेटअप है। डेवलपर MySQL को चालू करने, अनुमतियाँ सेट करने, PHP एक्सटेंशन स्थापित करने में घंटों बिताता है। Docker इस समस्या को हमेशा के लिए हल करता है। इस लेख में, हम Docker और Docker Compose का उपयोग करके PHP अनुप्रयोग के एकीकरण परीक्षण को व्यवस्थित करने का तरीका समझेंगे। आपको तैयार कॉन्फ़िगरेशन, कोड उदाहरण और अनुकूलन के लिए सुझाव मिलेंगे।
1. PHP परीक्षणों के लिए Docker पर्यावरण सेटअप
1.1. प्रोजेक्ट की मूल संरचना
मान लीजिए कि हमारे पास Symfony या Laravel पर एक सरल PHP अनुप्रयोग है (कोई भी फ्रेमवर्क काम करेगा)। प्रोजेक्ट के रूट में एक docker-compose.yml फ़ाइल बनाएँ:
version: '3.8'
services: php: build: . volumes: - .:/var/www/html environment: - DATABASE_URL=mysql://test_user:test_pass@db:3306/test_db depends_on: - db
db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root_pass MYSQL_DATABASE: test_db MYSQL_USER: test_user MYSQL_PASSWORD: test_pass ports: - "3307:3306" # स्थानीय डेटाबेस से टकराव से बचने के लिए गैर-मानक पोर्ट पर फॉरवर्डिंग
test_runner: image: php:8.2-cli volumes: - .:/var/www/html working_dir: /var/www/html entrypoint: ["vendor/bin/phpunit"] depends_on: - db - phpमुख्य बिंदु:
test_runnerसेवा PHP CLI के साथ एक अलग कंटेनर का उपयोग करती है - यह परीक्षणों के निष्पादन को मुख्य अनुप्रयोग से अलग करता है।- डेटाबेस एक साफ स्कीमा के साथ शुरू होता है। परीक्षणों के प्रत्येक रन के लिए, हम इसे पुनः बना सकते हैं।
- MySQL पोर्ट को
3307पर फॉरवर्ड किया गया है ताकि डेवलपर के स्थानीय डेटाबेस में हस्तक्षेप न हो।
1.2. PHP अनुप्रयोग के लिए Dockerfile
मुख्य php सेवा के लिए Dockerfile बनाएँ:
FROM php:8.2-fpm
RUN docker-php-ext-install pdo_mysql mysqli
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
COPY . .
RUN composer install --no-interaction --prefer-distइस इमेज का उपयोग विकास और परीक्षण दोनों के लिए किया जाएगा। pdo_mysql एक्सटेंशन स्थापित करना महत्वपूर्ण है - इसके बिना, डेटाबेस के साथ काम करने वाले परीक्षण विफल हो जाएंगे।
2. PHPUnit पर एकीकरण परीक्षण लिखना
2.1. PHPUnit की बुनियादी सेटिंग
सुनिश्चित करें कि आपने PHPUnit स्थापित किया है (Composer के माध्यम से)। phpunit.xml फ़ाइल को परीक्षण डेटाबेस की ओर इशारा करना चाहिए:
<?xml version="1.0" encoding="UTF-8"?><phpunit bootstrap="vendor/autoload.php"> <php> <env name="DATABASE_URL" value="mysql://test_user:test_pass@db:3306/test_db" /> <env name="APP_ENV" value="test" /> </php> <testsuites> <testsuite name="Integration"> <directory>tests/Integration</directory> </testsuite> </testsuites></phpunit>2.2. एकीकरण परीक्षण का उदाहरण: डेटाबेस के साथ काम करना
मान लीजिए कि हमारे पास एक उपयोगकर्ता रिपॉजिटरी है। आइए एक परीक्षण लिखें जो सेव और खोज की जाँच करता है:
<?php
namespace App\\Tests\\Integration;
use App\\Entity\\User;use App\\Repository\\UserRepository;use Doctrine\\ORM\\EntityManagerInterface;use Symfony\\Bundle\\FrameworkBundle\\Test\\KernelTestCase;
class UserRepos