परिचय: क्यों Docker और Swift एकीकरण परीक्षण के लिए आदर्श जोड़ी हैं?
\n\niOS और macOS के तहत आधुनिक विकास के लिए न केवल यूनिट परीक्षण बल्कि पूर्ण एकीकरण परीक्षण की भी आवश्यकता होती है। जब आपका एप्लिकेशन डेटाबेस, बाहरी API या फ़ाइल सिस्टम के साथ इंटरैक्ट करता है, तो प्रत्येक घटक का पृथक परीक्षण पर्याप्त नहीं रह जाता। यहीं पर Docker मदद करता है।
\n\nDocker परीक्षणों के लिए समान वातावरण बनाने की अनुमति देता है, जिससे "मेरी मशीन पर काम करता है" समस्या समाप्त हो जाती है। Swift डेवलपर्स के लिए यह विशेष रूप से प्रासंगिक है: कंटेनरीकरण सर्वर-साइड Swift अनुप्रयोगों (Vapor, Kitura) का परीक्षण करने के साथ-साथ iOS अनुप्रयोगों (डेटाबेस, कैश, संदेश कतारें) के लिए बुनियादी ढाँचे का अनुकरण करने का अवसर देता है।
\n\nइस लेख में, हम Docker के साथ Swift एकीकरण परीक्षण सेट करने के पूर्ण चक्र पर चर्चा करेंगे: परीक्षण वातावरण बनाने से लेकर CI/CD में चलाने तक।
\n\n1. वातावरण तैयार करना: Docker और Swift
\n\n1.1. Docker और Swift Toolchain स्थापित करना
\n\nसबसे पहले सुनिश्चित करें कि आपके पास निम्नलिखित स्थापित हैं:
\n- \n
- Docker Desktop (macOS के लिए) या Docker Engine (Linux के लिए) \n
- Swift Toolchain संस्करण 5.7+ (swift.org से डाउनलोड किया जा सकता है) \n
- Xcode 14+ (यदि iOS घटकों का परीक्षण कर रहे हैं) \n
1.2. Swift के लिए Dockerfile बनाना
\n\nहम अपने Swift एप्लिकेशन के लिए एक बुनियादी Docker इमेज बनाकर शुरू करते हैं। अपने प्रोजेक्ट की रूट में Dockerfile फ़ाइल बनाएँ:
# Dockerfile\nFROM swift:5.9-focal AS base\n\n# कार्यशील निर्देशिका सेट करें\nWORKDIR /app\n\n# मेनिफेस्ट फ़ाइल Package.swift कॉपी करें\nCOPY Package.swift ./\nCOPY Sources/ ./Sources/\nCOPY Tests/ ./Tests/\n\n# प्रोजेक्ट बिल्ड करें\nRUN swift build -c debug\n\n# परीक्षणों के लिए अंतिम इमेज\nFROM base AS test\nCMD ["swift", "test", "--parallel"]\n\n\nयह इमेज प्रोजेक्ट को बिल्ड करती है और परीक्षण चलाती है। एकीकरण परीक्षणों के लिए हमें अतिरिक्त सेवाओं की आवश्यकता होगी।
\n\n2. Docker Compose के साथ एकीकरण परीक्षण
\n\nDocker Compose एक साथ कई कंटेनर चलाने की अनुमति देता है। एक सामान्य परिदृश्य के लिए हमें आवश्यकता होगी:
\n- \n
- हमारे Swift एप्लिकेशन के साथ एक कंटेनर \n
- PostgreSQL (या अन्य DB) के साथ एक कंटेनर \n
- Redis (कैशिंग के लिए) के साथ एक कंटेनर \n
2.1. docker-compose.yml का उदाहरण
\n\n# docker-compose.yml\nversion: '3.8'\n\nservices:\n postgres:\n image: postgres:15\n environment:\n POSTGRES_USER: test_user\n POSTGRES_PASSWORD: test_pass\n POSTGRES_DB: test_db\n ports:\n - "5432:5432"\n healthcheck:\n test: ["CMD-SHELL", "pg_isready -U test_user -d test_db"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n redis:\n image: redis:7-alpine\n ports:\n - "6379:6379"\n\n swift-tests:\n build:\n context: .\n dockerfile: Dockerfile.test\n depends_on:\n postgres:\n condition: service_healthy\n redis:\n condition: service_started\n environment:\n DATABASE_URL: "postgres://test_user:test_pass@postgres:5432/test_db"\n REDIS_URL: "redis://redis:6379"\n volumes:\n - .:/app\n\n\n2.2. परीक्षणों के लिए विशेष Dockerfile
\n\nहम Dockerfile.test बनाएँगे जो निर्भरताओं के तैयार होने की प्रतीक्षा करेगा:
# Dockerfile.test\nFROM swift:5.9-focal\n\nWORKDIR /app\n\n# कनेक्शन जाँच के लिए netcat स्थापित करें\nRUN apt-get update && apt-get install -y netcat-openbsd && rm -rf /var/lib/apt/lists/*\n\nCOPY Package.swift ./\nRUN swift package resolve\n\nCOPY . .\n\n# PostgreSQL और Redis की प्रतीक्षा करें\nCOPY wait-for-services.sh /usr/local/bin/\nRUN chmod +x /usr/local/bin/wait-for-services.sh\n\nCMD ["wait-for-services.sh"]\n\n\nस्क्रिप्ट wait-for-services.sh:
#!/bin/bash\n# wait-for-services.sh\n\necho "PostgreSQL की प्रतीक्षा की जा रही है..."\nwhile ! nc -z postgres