مقدمة
\nاختبار التكامل هو مرحلة حاسمة في التطوير تتحقق من تفاعل مكونات تطبيق Swift الخاص بك مع التبعيات الخارجية: قواعد البيانات، واجهات برمجة التطبيقات (API)، أنظمة الملفات والخدمات الشبكية. ومع ذلك، غالبًا ما تعاني الأساليب التقليدية لاختبار التكامل على macOS/iOS من "مشكلة البيئة" — فالاختبارات التي تعمل على جهاز المطور قد تفشل على خادم CI بسبب الاختلافات في إصدارات المكتبات، إعدادات الشبكة أو تكوين قاعدة البيانات.
\nيحل Docker هذه المشكلة بشكل جذري: حيث تقوم بتغليف جميع التبعيات (PostgreSQL، Redis، خوادم المحاكاة) في حاويات معزولة تعمل بشكل متطابق على أي منصة. في هذه المقالة، سنستعرض تقنيات متقدمة لاختبار التكامل لـ Swift مع Docker: من إعداد بيئة الاختبار إلى التشغيل المتوازي والتكامل مع CI/CD.
\n\n1. إعداد بيئة الاختبار باستخدام Docker Compose
\nلنبدأ بإنشاء بيئة معزولة للاختبارات. بدلاً من تشغيل كل خدمة يدويًا، نستخدم docker-compose.yml لوصف جميع التبعيات بشكل تصريحي.
مثال على docker-compose.yml لمشروع Swift
\nversion: '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 بدلاً من الخدمات المحلية، نستخدم متغيرات البيئة:
\nimport 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\n2. إعداد متقدم: التشغيل المتوازي وعزل الاختبارات
\nإحدى المشكلات الرئيسية في اختبارات التكامل هي وقت تنفيذها. يتيح Docker تشغيل نسخ متعددة من بيئة الاختبار بالتوازي، مما يسرع عملية التشغيل بشكل كبير.
\n\nاستراتيجية العزل: حاوية واحدة لكل فئة اختبار
\nنستخدم docker-compose --project-name لإنشاء مثيلات فريدة:
#!/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