اختبار التكامل PHP مع Docker: المستوى المتقدم

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

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

ابدأ الدورة

اختبار التكامل PHP مع Docker: من السيناريوهات الأساسية إلى الحلول الصناعية

\n\n

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

\n\n

لماذا Docker هو الرفيق المثالي لاختبارات التكامل PHP؟

\n\n

تعاني الأساليب التقليدية لاختبار التكامل غالبًا من مشاكل البيئة: قد تكون قواعد البيانات مختلفة على الجهاز المحلي وخادم CI، وقد تكون المنافذ مشغولة، وقد لا تتطابق التبعيات. يحل Docker هذه المشاكل بشكل جذري:

\n\n
    \n
  • العزل: يتم تشغيل كل سيناريو اختبار في حاوية نظيفة، مما يمنع الآثار الجانبية من الاختبارات السابقة.
  • \n
  • قابلية التكرار: الصور ذات الإصدارات الثابتة من PHP والإضافات والخدمات تضمن أن الاختبارات ستعمل بنفس الطريقة على أي جهاز.
  • \n
  • التوازي: يمكنك تشغيل مجموعات اختبار متعددة في وقت واحد، كل منها في حاويتها الخاصة مع قاعدة بيانات فريدة.
  • \n
  • السرعة: تتيح الأدوات الحديثة مثل Testcontainers أو Docker Compose رفع البيئات وإزالتها في ثوانٍ.
  • \n
\n\n

هذا مهم بشكل خاص لـ PHP، حيث يتفاعل التطبيق النموذجي مع العديد من الموارد الخارجية - من قوائم الانتظار (RabbitMQ) إلى محركات البحث (Elasticsearch).

\n\n

إعداد بيئة اختبار متعددة المستويات باستخدام Docker Compose

\n\n

الخطوة الأولى نحو الاختبار المتقدم هي إنشاء ملف docker-compose.yml مرن لا يشمل PHP فحسب، بل جميع الخدمات الضرورية. لننظر إلى مثال لتطبيق على Laravel/Symfony يستخدم MySQL و Redis و REST API خارجي:

\n\n
version: '3.8'\n\nservices:\n  php-test:\n    image: php:8.2-cli\n    volumes:\n      - ./:/app\n    working_dir: /app\n    environment:\n      - DB_HOST=mysql-test\n      - DB_DATABASE=test_db\n      - REDIS_HOST=redis-test\n      - API_BASE_URL=http://mock-api:8080\n    depends_on:\n      mysql-test:\n        condition: service_healthy\n      redis-test:\n        condition: service_started\n      mock-api:\n        condition: service_started\n\n  mysql-test:\n    image: mysql:8.0\n    environment:\n      MYSQL_ROOT_PASSWORD: root\n      MYSQL_DATABASE: test_db\n    healthcheck:\n      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]\n      interval: 5s\n      timeout: 3s\n      retries: 5\n\n  redis-test:\n    image: redis:7-alpine\n\n  mock-api:\n    image: wiremock/wiremock:latest\n    volumes:\n      - ./tests/mock-api:/home/wiremock\n
\n\n

النقطة الأساسية هي استخدام WireMock لمحاكاة واجهات API الخارجية. يتيح ذلك اختبار التكامل مع الخدمات التي قد تكون غير متاحة أو غير مستقرة في بيئة الاختبار. يعمل WireMock في حاوية منفصلة ويعيد استجابات محددة مسبقًا بناءً على ملفات تكوين JSON.

\n\n

لتشغيل الاختبارات داخل هذه البيئة، استخدم السكريبت:

\n\n
#!/bin/bash\ndocker-compose -f docker-compose.test.yml up -d\ndocker-compose -f docker-compose.test.yml exec php-test vendor/bin/phpunit --testsuite=Integration\ndocker-compose -f docker-compose.test.yml down
\n\n

تقنيات متقدمة: إنشاء الحاويات ديناميكيًا والتشغيل المتوازي

\n\n

عندما ينمو المشروع، قد يصبح ملف docker-compose.yml الثابت عنق زجاجة. هنا تأتي مكتبة Testcontainers (المتاحة لـ PHP عبر حزمة testc

المدونات

توصيات الكتب