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

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

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

ابدأ الدورة

مقدمة

\n

اختبار التكامل هو مرحلة حاسمة في التطوير تتحقق من تفاعل مكونات تطبيق Swift الخاص بك مع التبعيات الخارجية: قواعد البيانات، واجهات برمجة التطبيقات (API)، أنظمة الملفات والخدمات الشبكية. ومع ذلك، غالبًا ما تعاني الأساليب التقليدية لاختبار التكامل على macOS/iOS من "مشكلة البيئة" — فالاختبارات التي تعمل على جهاز المطور قد تفشل على خادم CI بسبب الاختلافات في إصدارات المكتبات، إعدادات الشبكة أو تكوين قاعدة البيانات.

\n

يحل Docker هذه المشكلة بشكل جذري: حيث تقوم بتغليف جميع التبعيات (PostgreSQL، Redis، خوادم المحاكاة) في حاويات معزولة تعمل بشكل متطابق على أي منصة. في هذه المقالة، سنستعرض تقنيات متقدمة لاختبار التكامل لـ Swift مع Docker: من إعداد بيئة الاختبار إلى التشغيل المتوازي والتكامل مع CI/CD.

\n\n

1. إعداد بيئة الاختبار باستخدام Docker Compose

\n

لنبدأ بإنشاء بيئة معزولة للاختبارات. بدلاً من تشغيل كل خدمة يدويًا، نستخدم docker-compose.yml لوصف جميع التبعيات بشكل تصريحي.

\n\n

مثال على docker-compose.yml لمشروع Swift

\n
version: '3.8'\nservices:\n  postgres_test:\n    image: postgres:15-alpine\n    environment:\n      POSTGRES_USER: test_user\n      POSTGRES_PASSWORD: test_pass\n      POSTGRES_DB: swift_test_db\n    ports:\n      - "5433:5432"  # استخدام منفذ غير قياسي لتجنب التعارض مع قاعدة البيانات المحلية\n    tmpfs: /var/lib/postgresql/data  # البيانات في الذاكرة — تنظيف سريع\n\n  redis_test:\n    image: redis:7-alpine\n    ports:\n      - "6380:6379"\n\n  mock_server:\n    build: ./mock-server  # خادم محاكاة مخصص على Vapor\n    ports:\n      - "8081:8080"\n    environment:\n      LOG_LEVEL: debug
\n\n

كود Swift للتكوين الديناميكي للاختبارات

\n

لكي تتصل الاختبارات بحاويات Docker بدلاً من الخدمات المحلية، نستخدم متغيرات البيئة:

\n
import XCTest\n\nfinal class IntegrationTests: XCTestCase {\n    var app: XCTestApplication?\n\n    override func setUp() async throws {\n        // الحصول على التكوين من متغيرات البيئة (يتم تعيينها في CI أو docker-compose)\n        let dbHost = ProcessInfo.processInfo.environment["DB_HOST"] ?? "localhost"\n        let dbPort = Int(ProcessInfo.processInfo.environment["DB_PORT"] ?? "5433") ?? 5433\n        let redisHost = ProcessInfo.processInfo.environment["REDIS_HOST"] ?? "localhost"\n        let mockHost = ProcessInfo.processInfo.environment["MOCK_HOST"] ?? "http://localhost:8081"\n\n        // تكوين تطبيق الاختبار (مثل Vapor أو Kitura)\n        let config = AppConfig(\n            database: DatabaseConfig(host: dbHost, port: dbPort, \n                                     username: "test_user", password: "test_pass",\n                                     database: "swift_test_db"),\n            redis: RedisConfig(host: redisHost, port: 6380),\n            mockServiceURL: mockHost\n        )\n\n        app = try await XCTestApplication.start(config: config)\n    }\n\n    override func tearDown() async throws {\n        try await app?.shutdown()\n    }\n}
\n\n

2. إعداد متقدم: التشغيل المتوازي وعزل الاختبارات

\n

إحدى المشكلات الرئيسية في اختبارات التكامل هي وقت تنفيذها. يتيح Docker تشغيل نسخ متعددة من بيئة الاختبار بالتوازي، مما يسرع عملية التشغيل بشكل كبير.

\n\n

استراتيجية العزل: حاوية واحدة لكل فئة اختبار

\n

نستخدم docker-compose --project-name لإنشاء مثيلات فريدة:

\n
#!/bin/bash\n# تشغيل الاختبارات باسم مشروع فريد للتنفيذ المتوازي\nTEST_SUITE=$1\nPROJECT_NAME="swift_test_${TEST_SUITE}_$(date +%s)"\n\ndocker-compose -p $PROJECT_NAME up -d --force-recreate\nsleep 5  # انتظار تهيئة الحاويات\n\n# تشغيل فئة اختبار محددة\nxcodebuild test -scheme MyApp -destina                

المدونات

توصيات الكتب