اختبار التكامل لجافا سكريبت مع Docker: دليل شامل

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

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

ابدأ الدورة

الاختبار التكاملي لـ 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

المدونات

توصيات الكتب