اختبار التكامل 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
هذا مهم بشكل خاص لـ PHP، حيث يتفاعل التطبيق النموذجي مع العديد من الموارد الخارجية - من قوائم الانتظار (RabbitMQ) إلى محركات البحث (Elasticsearch).
\n\nإعداد بيئة اختبار متعددة المستويات باستخدام Docker Compose
\n\nالخطوة الأولى نحو الاختبار المتقدم هي إنشاء ملف docker-compose.yml مرن لا يشمل PHP فحسب، بل جميع الخدمات الضرورية. لننظر إلى مثال لتطبيق على Laravel/Symfony يستخدم MySQL و Redis و REST API خارجي:
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