اختبار التكامل لـ TypeScript مع Docker: دليل شامل

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

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

ابدأ الدورة

مقدمة: لماذا نحتاج إلى اختبار التكامل لـ TypeScript مع Docker؟



اختبار التكامل هو مرحلة أساسية في التطوير تتحقق من التفاعل بين الوحدات المختلفة لتطبيقك. على عكس اختبارات الوحدة التي تعزل مكونًا واحدًا، تتحقق اختبارات التكامل من كيفية عمل قاعدة البيانات وAPI والخدمات الخارجية ومنطق الأعمال معًا.



استخدام Docker في اختبار التكامل لـ TypeScript يحل عدة مشكلات:



  • عزل البيئة — يتم تشغيل الاختبارات في ظروف متطابقة على جميع الأجهزة
  • إدارة التبعيات — يتم تشغيل قواعد البيانات وقوائم الانتظار وذاكرة التخزين المؤقت تلقائيًا
  • قابلية إعادة الإنتاج — تعطي الاختبارات نفس النتائج محليًا وفي CI/CD
  • استعادة سريعة — يتم إعادة إنشاء الحاويات في ثوانٍ


في هذه المقالة، سنحلل مثالًا عمليًا لإعداد اختبار التكامل لتطبيق TypeScript باستخدام Docker وJest وSupertest.



1. إعداد المشروع وتثبيت التبعيات



لنبدأ بإنشاء مشروع TypeScript أساسي. تأكد من تثبيت Node.js (v18+) وDocker.



mkdir typescript-docker-testingcd typescript-docker-testingnpm init -ynpm install express typescript ts-node @types/node @types/expressnpm install --save-dev jest ts-jest @types/jest supertest @types/supertest


قم بإنشاء tsconfig.json:



{  "compilerOptions": {    "target": "ES2020",    "module": "commonjs",    "outDir": "./dist",    "rootDir": "./src",    "strict": true,    "esModuleInterop": true,    "skipLibCheck": true  },  "include": ["src/**/*"],  "exclude": ["node_modules", "**/*.test.ts"]}


قم بتكوين Jest في package.json:



"jest": {  "preset": "ts-jest",  "testEnvironment": "node",  "testMatch": ["**/*.test.ts"]}


2. إنشاء تطبيق Express بسيط



لنقم بإنشاء هيكل المجلدات وتطبيق بسيط سيتفاعل مع قاعدة بيانات PostgreSQL.



mkdir srcmkdir src/configmkdir src/modelsmkdir src/routesmkdir src/__tests__


src/config/database.ts — تكوين الاتصال بقاعدة البيانات:



import { Pool } from 'pg';

const pool = new Pool({ host: process.env.DB_HOST || 'localhost', port: Number(process.env.DB_PORT) || 5432, database: process.env.DB_NAME || 'testdb', user: process.env.DB_USER || 'testuser', password: process.env.DB_PASSWORD || 'testpass'});

export default pool;


src/app.ts — التطبيق الرئيسي:



import express from 'express';import userRoutes from './routes/users';

const app = express();app.use(express.json());app.use('/api/users', userRoutes);

export default app;


src/index.ts — نقطة الدخول:



import app from './app';

const PORT = process.env.PORT || 3000;app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});


src/routes/users.ts — مسار بسيط للمستخدمين:



import { Router, Request, Response } from 'express';import pool from '../config/database';

const router = Router();

router.get('/', async (req: Request, res: Response) => { try { const result = await pool.query('SELECT * FROM users'); res.json(result.rows); } catch (error) { res.status(500).json({ error: 'Database error' }); }});

router.post('/', async (req: Request, res: Response) => { const { name, email } = req.body; try { const result = await pool.query( 'INSERT INTO users (name, email) VALUES ($1, $2) RETURNING *', [name, email] ); res.status(201).json(result.r

المدونات

توصيات الكتب