اختبار التكامل لجافا سكريبت مع Docker: من الألف إلى الياء
\n\nفي تطوير الويب الحديث، جودة الكود ليست مجرد مقياس، بل هي ضمان لاستقرار المنتج. يحتل اختبار التكامل (Integration Testing) مكانة رئيسية في هرم الاختبار، حيث يسمح بالتحقق من التفاعل بين الوحدات المختلفة، قواعد البيانات، واجهات API الخارجية والخدمات. ومع ذلك، غالبًا ما يصبح إعداد بيئات معزولة وقابلة للتكرار لمثل هذه الاختبارات صداعًا. هنا يأتي دور Docker — أداة الحاويات التي تعتبر مثالية لإنشاء بيئات اختبار نظيفة وقابلة للتكرار.
\n\nفي هذه المقالة، سنشرح كيفية تنظيم اختبار التكامل لتطبيقات جافا سكريبت (Node.js) باستخدام Docker. ستتعلم كيفية تشغيل قاعدة بيانات اختبار، تشغيل التبعيات في الحاويات، وكتابة اختبارات فعالة يمكن دمجها بسهولة في خط أنابيب CI/CD.
\n\n1. لماذا يعتبر Docker مثاليًا لاختبارات التكامل؟
\n\nغالبًا ما يتطلب النهج التقليدي لاختبار التكامل إعدادًا يدويًا للبيئة على كل جهاز مطور أو خادم CI. وهذا يؤدي إلى مشكلة "يعمل على جهازي". يحل Docker هذه المشكلة بشكل جذري:
\n\n- \n
- العزل: يتم تشغيل كل اختبار في حاوية نظيفة، مما يستبعد تأثير الآثار الجانبية من عمليات التشغيل السابقة. \n
- قابلية التكرار: نفس البيئة (إصدار Node.js، قواعد البيانات، المكتبات النظامية) تعمل بشكل مضمون في كل مكان: على جهاز المطور المحلي، على خادم البناء، وفي الإنتاج. \n
- إدارة التبعيات: يمكنك بسهولة تشغيل بنى تحتية معقدة (Redis، PostgreSQL، RabbitMQ) بأمر واحد
docker-compose up -d. \n - السرعة: يتم تشغيل الحاويات في ثوانٍ، على عكس الآلات الافتراضية. يقوم Docker بتخزين الطبقات مؤقتًا، مما يسرع عمليات البناء المتكررة. \n
في سياق Node.js، يسمح Docker بـ "محاكاة" الخدمات الخارجية دون مغادرة بيئة التطوير. بدلاً من الاتصال بواجهة API للإنتاج، تقوم بتشغيل حاوية اختبار تحتوي، على سبيل المثال، على json-server أو testcontainers.
2. إعداد مشروع Node.js للاختبار
\n\nلنفترض أن لدينا تطبيق Express بسيط يقوم بحفظ المستخدمين في PostgreSQL. مهمتنا هي اختبار نقطة النهاية POST /users.
هيكل المشروع:
\n\nproject/\n├── src/\n│ ├── app.js\n│ ├── db.js\n│ └── routes/\n│ └── users.js\n├── test/\n│ └── integration/\n│ └── users.test.js\n├── docker-compose.test.yml\n├── Dockerfile\n├── package.json\n└── .env.test\n\n\n
لإجراء الاختبارات، سنستخدم مجموعة الأدوات الشائعة: Mocha (إطار العمل) + Chai (مكتبة التأكيدات) + Supertest (اختبار HTTP).
\n\nسنقوم بتثبيت التبعيات:
\nnpm install --save-dev mocha chai supertest\n\nيجب أن يحتوي ملف package.json على سكريبت لتشغيل الاختبارات:
{\n "scripts": {\n "test:integration": "mocha test/integration/**/*.test.js --timeout 10000"\n }\n}\n\n3. إنشاء بيئة Docker للاختبارات
\n\nالملف الرئيسي هو docker-compose.test.yml. يصف الخدمات اللازمة للاختبارات.
version: '3.8'\n\nservices:\n app-test:\n build:\n context: .\n dockerfile: Dockerfile\n environment:\n - NODE_ENV=test\n - DB_HOST=postgres-test\n - DB_PORT=5432\n - DB_USER=test_user\n - DB_PASSWORD=test_pass\n - DB_NAME=test_db\n depends_on:\n postgres-test:\n condition: service_healthy\n command: ["npm", "run", "test:integration"]\n\n postgres-test:\n image: postgres:15-alpine\n environment:\n POSTGRES_USER: test_user\n POSTGRES_PASSWORD: test_