مقدمة: لماذا يعتبر اختبار التكامل PHP في Docker أمرًا لا غنى عنه
نادرًا ما يقتصر تطوير تطبيقات PHP الحديثة على خادم واحد. قواعد البيانات، التخزين المؤقت (Redis, Memcached)، قوائم الانتظار (RabbitMQ)، واجهات برمجة التطبيقات الخارجية — كلها تتطلب التحقق من تفاعل المكونات. اختبارات الوحدة (unit tests) تعزل الكود، لكنها لا تضمن أن الفئة A تعمل بشكل صحيح مع الفئة B عبر قاعدة بيانات حقيقية. هنا يأتي دور اختبار التكامل.
مشكلة النهج التقليدي هي إعداد البيئة. يقضي المطور ساعات في إعداد MySQL، ضبط الأذونات، تثبيت إضافات PHP. Docker يحل هذه المشكلة نهائيًا. في هذه المقالة، سنشرح كيفية تنظيم اختبار التكامل لتطبيق PHP باستخدام Docker و Docker Compose. ستحصل على إعدادات جاهزة، أمثلة كود، وتوصيات للتحسين.
1. إعداد بيئة Docker لاختبارات PHP
1.1. هيكل المشروع الأساسي
لنفترض أن لدينا تطبيق PHP بسيط على Symfony أو Laravel (أي إطار عمل سيناسب). سننشئ ملف 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. Dockerfile لتطبيق PHP
سننشئ Dockerfile للخدمة الرئيسية php:
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