اختبار التكامل لـ TypeScript مع Docker: المستوى المتقدم

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

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

ابدأ الدورة

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

المدونات

توصيات الكتب