اختبار التكامل PHP مع Docker: دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

اختبار التكامل PHP مع Docker: من الألف إلى الياء

\n\n

تطوير PHP الحديث لا يمكن تصوره بدون اختبارات عالية الجودة. بينما تتحقق اختبارات الوحدة من أجزاء معزولة من الكود، فإن اختبار التكامل يضمن أن جميع مكونات النظام تعمل معًا: قاعدة البيانات، Redis، واجهات برمجة التطبيقات الخارجية، ونظام الملفات. يجعل Docker هذه العملية قابلة للتكرار وسريعة ومستقلة عن بيئة المطور. في هذه المقالة، سنشرح كيفية إعداد اختبار التكامل لتطبيق PHP باستخدام Docker من الصفر.

\n\n

لماذا Docker هو الأداة المثالية لاختبارات التكامل؟

\n\n

المشاكل التقليدية لاختبار التكامل:

\n
    \n
  • الاعتماد على البيئة — لكل مطور إصدار MySQL وPHP وRedis خاص به.
  • \n
  • تلوث البيانات — تترك الاختبارات بيانات غير مرغوب فيها في قاعدة البيانات الحقيقية.
  • \n
  • صعوبة التشغيل المتوازي — تتعارض الاختبارات مع بعضها البعض.
  • \n
\n\n

يحل Docker هذه المشاكل:

\n
    \n
  • يتم تشغيل كل اختبار في حاوية نظيفة بإصدارات معروفة من التبعيات.
  • \n
  • الحاويات معزولة ويتم إزالتها بعد التشغيل.
  • \n
  • يتيح Docker Compose رفع البنية التحتية بأكملها بأمر واحد.
  • \n
\n\n

الخطوة 1: هيكل المشروع و Docker Compose

\n\n

لنبدأ بتطبيق PHP نموذجي على Symfony. لننشئ ملف docker-compose.test.yml لبيئة الاختبار:

\n\n
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:

\n\n
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\n

لاحظ tmpfs — هذا هو تثبيت نظام ملفات مؤقت في الذاكرة. ستعمل قاعدة البيانات و Redis بشكل أسرع بكثير من القرص، وهو أمر بالغ الأهمية للاختبارات السريعة.

\n\n

الخطوة 2: إعداد PHPUnit لاختبارات التكامل

\n\n

لننشئ تكوينًا منفصلاً phpunit.integration.xml.dist:

\n\n
<?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 لتهيئة بيئة الاختبار:

\n\n
<?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\                

المدونات

توصيات الكتب