اختبار التكامل لـ TypeScript مع Docker: المستوى المتقدم
اختبار التكامل هو مرحلة أساسية في تطوير تطبيقات TypeScript الحديثة. عندما يتكون نظامك من العديد من الخدمات المصغرة وقواعد البيانات وصفوف الرسائل وواجهات برمجة التطبيقات الخارجية، فإن اختبارات الوحدة المعزولة تتوقف عن تغطية سيناريوهات التفاعل الحقيقية. يتيح Docker إنشاء بيئات اختبار معزولة وقابلة للتكرار، قريبة من بيئة الإنتاج. في هذه المقالة، سننظر في التقنيات المتقدمة لاختبار التكامل لتطبيقات TypeScript باستخدام Docker: من إعداد الحاويات إلى بناء خطوط أنابيب CI/CD.
لماذا Docker هو الأداة المثالية لاختبارات التكامل لـ TypeScript
غالبًا ما تعاني الأساليب التقليدية لاختبار التكامل من مشاكل البيئة: "إنها تعمل على جهازي". يحل Docker هذه المشكلة من خلال توفير:
- العزل — يتم تشغيل كل اختبار في حاوية نظيفة، دون التأثير على العمليات الأخرى
- قابلية التكرار — نفس البيئة في جميع المراحل: محليًا، في CI، في staging
- السرعة — يتم تشغيل الحاويات خفيفة الوزن في ثوانٍ
- المرونة — سهولة الجمع بين إصدارات مختلفة من قواعد البيانات وذاكرة التخزين المؤقت وصفوف الرسائل
بالنسبة لمشاريع TypeScript، يعتبر Docker مفيدًا بشكل خاص، حيث يسمح باختبار ليس فقط وقت تشغيل Node.js، ولكن أيضًا التفاعل مع مترجم TypeScript والترجمة والبناء.
إعداد بيئة Docker لاختبارات TypeScript
لنبدأ بالتكوين الأساسي. سنقوم بإنشاء Dockerfile للبناء الإنتاجي وآخر منفصل للاختبارات:
# Dockerfile.testFROM node:18-alpine AS builder
WORKDIR /appCOPY package*.json ./RUN npm ciCOPY tsconfig.json ./COPY src/ ./src/
# بناء TypeScriptRUN npm run build
# مرحلة تشغيل الاختباراتFROM node:18-alpine AS test-runnerWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modulesCOPY --from=builder /app/package.json ./COPY tests/ ./tests/COPY jest.config.ts ./
# تشغيل اختبارات التكاملCMD ["npx", "jest", "--config", "jest.config.ts", "--testMatch", "**/*.integration.test.ts"]لإدارة خدمات متعددة، نستخدم docker-compose.yml:
version: '3.8'services: app: build: context: . dockerfile: Dockerfile.test depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: - DB_HOST=postgres - DB_PORT=5432 - REDIS_HOST=redis - REDIS_PORT=6379 volumes: - ./tests:/app/tests:ro networks: - test-network
postgres: image: postgres:15-alpine environment: POSTGRES_DB: testdb POSTGRES_USER: testuser POSTGRES_PASSWORD: testpass healthcheck: test: ["CMD-SHELL", "pg_isready -U testuser -d testdb"] interval: 5s timeout: 5s retries: 5 networks: - test-network
redis: image: redis:7-alpine healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 networks: - test-network
networks: test-network: driver: bridgeكتابة اختبارات تكامل متقدمة بلغة TypeScript
الآن سنقوم بإنشاء اختبار يتحقق من سيناريو كامل: الكتابة في قاعدة البيانات، التخزين المؤقت في Redis، وإرسال حدث إلى صف الرسائل. نستخدم مكتبة testcontainers للإدارة الديناميكية للحاويات من كود TypeScript:
// tests/integration/user-registration.integration.test.tsimport { GenericContainer, StartedTestContainer, Wait } from 'testcontainers';import { PostgreSqlContainer } from '@testcontainers/postgresql';import { RedisContainer } from '@testcontainers/redis';import axi