الاختبار التكاملي لـ JavaScript باستخدام Docker: دليل شامل
الاختبار التكاملي هو مرحلة حاسمة في تطوير JavaScript (Node.js). فهو يتحقق من تفاعل تطبيقك مع الخدمات الخارجية: قواعد البيانات، واجهات API، التخزين المؤقت، وقوائم الانتظار. استخدام Docker لهذه الأغراض يسمح بعزل بيئة الاختبار، وضمان إمكانية إعادة إنتاجها، وتجنب مشاكل "إنه يعمل على جهازي". في هذه المقالة، سنشرح كيفية إعداد الاختبار التكاملي لتطبيقات JavaScript باستخدام Docker و Docker Compose وأطر الاختبار الشائعة.
لماذا نحتاج Docker للاختبار التكاملي؟
غالباً ما يواجه الاختبار التكاملي التقليدي مشاكل: قد تختلف التبعيات على أجهزة المطورين المختلفة، قد تكون قواعد البيانات في حالات مختلفة، وإعداد البيئة يستغرق ساعات. يحل Docker هذه المشاكل من خلال توفير:
- العزل: كل تشغيل اختبار يحدث في حاوية نظيفة.
- إمكانية إعادة الإنتاج: بيئة موحدة لجميع المطورين و CI/CD.
- السرعة: الحاويات تبدأ في ثوانٍ وليس دقائق.
- إدارة التبعيات: سهولة تشغيل PostgreSQL و Redis و RabbitMQ وخدمات أخرى.
إعداد بيئة الاختبار باستخدام Docker Compose
لنبدأ بإنشاء المشروع. لنفترض أن لدينا تطبيق Node.js بسيط يقوم بحفظ البيانات في PostgreSQL. سننشئ ملف docker-compose.test.yml:
version: '3.8'
services: test-runner: build: context: . dockerfile: Dockerfile.test depends_on: - db - redis environment: - NODE_ENV=test - DATABASE_URL=postgresql://testuser:testpass@db:5432/testdb - REDIS_URL=redis://redis:6379 volumes: - ./coverage:/app/coverage
db: image: postgres:15-alpine environment: POSTGRES_USER: testuser POSTGRES_PASSWORD: testpass POSTGRES_DB: testdb ports: - "5432" tmpfs: - /var/lib/postgresql/data
redis: image: redis:7-alpine ports: - "6379"لاحظ استخدام tmpfs لـ PostgreSQL - هذا يضمن عدم حفظ البيانات بعد انتهاء الاختبارات، وكل تشغيل يبدأ بقاعدة بيانات نظيفة.
Dockerfile للاختبارات
سننشئ Dockerfile.test المحسّن للاختبار وليس للإنتاج:
FROM node:18-alpine
WORKDIR /app
# ننسخ package.json فقط لتخزين طبقة التبعيات مؤقتاًCOPY package*.json ./RUN npm ci --only=production && npm ci --only=dev
# ننسخ الكود المصدريCOPY . .
# نثبت wait-for-it لانتظار جاهزية الخدماتADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /wait-for-it.shRUN chmod +x /wait-for-it.sh
CMD ["sh", "-c", "/wait-for-it.sh db:5432 -- /wait-for-it.sh redis:6379 -- npm test"]كتابة الاختبارات التكاملية في JavaScript
الآن سنكتب الاختبارات بأنفسنا. سنستخدم Jest و Supertest لاختبار API. سننشئ ملف tests/integration/user.test.js:
const request = require('supertest');const { app } = require('../src/app');const { Pool } = require('pg');
describe('User API Integration Tests', () => { let pool;
beforeAll(async () => { // ننشئ مجموعة اتصالات بقاعدة بيانات الاختبار pool = new Pool({ connectionString: process.env.DATABASE_URL });
// ننفذ الترحيلات قبل الاختبارات const migrationSQL = ` CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); `; await pool.query(migrationSQL); });
afterAll(async