डॉकर के साथ स्विफ्ट एकीकरण परीक्षण: उन्नत स्तर
\n\nएकीकरण परीक्षण विश्वसनीय स्विफ्ट अनुप्रयोगों के विकास में एक महत्वपूर्ण चरण है। यूनिट परीक्षणों के विपरीत, यह वास्तविक घटकों: डेटाबेस, नेटवर्क सेवाओं, फ़ाइल सिस्टम के बीच बातचीत की जाँच करता है। डॉकर इन निर्भरताओं को अलग करने की अनुमति देता है, जिससे परीक्षण प्रतिलिपि प्रस्तुत करने योग्य और डेवलपर वातावरण से स्वतंत्र हो जाते हैं। इस लेख में, हम डॉकर का उपयोग करके स्विफ्ट अनुप्रयोगों (iOS और सर्वर पक्ष) के एकीकरण परीक्षण की उन्नत तकनीकों पर विचार करेंगे।
\n\n1. स्विफ्ट परीक्षणों के लिए डॉकर कंटेनरीकरण की मूल बातें
\n\nउन्नत परिदृश्यों में गहराई से जाने से पहले, मूल आर्किटेक्चर को समझना महत्वपूर्ण है। डॉकर आपको निर्भरताओं (PostgreSQL, Redis, मॉक सर्वर) को पृथक कंटेनरों में चलाने की अनुमति देता है, जो परीक्षणों से पहले स्वचालित रूप से शुरू होते हैं और बाद में नष्ट हो जाते हैं।
\n\nसर्वर-साइड स्विफ्ट (Vapor, Kitura) के लिए, हम आधिकारिक स्विफ्ट इमेज का उपयोग करते हैं। iOS अनुप्रयोगों के लिए, डॉकर सिम्युलेटर नहीं चला सकता, लेकिन नेटवर्क लेयर और बैकएंड के परीक्षण के लिए उपयुक्त है।
\n\nVapor प्रोजेक्ट के लिए मूल Docker Compose फ़ाइल का उदाहरण:
\n\nversion: '3.8'\nservices:\n app:\n image: swift:5.10-focal\n working_dir: /app\n volumes:\n - .:/app\n depends_on:\n - db\n - redis\n environment:\n - DATABASE_URL=postgres://user:pass@db:5432/testdb\n - REDIS_URL=redis://redis:6379\n\n db:\n image: postgres:16-alpine\n environment:\n POSTGRES_USER: user\n POSTGRES_PASSWORD: pass\n POSTGRES_DB: testdb\n ports:\n - "5432:5432"\n\n redis:\n image: redis:7-alpine\n ports:\n - "6379:6379"\n\nयह फ़ाइल तीन कंटेनर शुरू करती है: स्विफ्ट सर्वर, PostgreSQL और Redis। अब हम एक एकीकरण परीक्षण लिखेंगे जो वास्तविक डेटाबेस में उपयोगकर्ता को सहेजने की जाँच करता है।
\n\n2. XCTest और डॉकर के साथ एकीकरण परीक्षण लिखना
\n\nसर्वर-साइड स्विफ्ट के एकीकरण परीक्षण के लिए, हम मानक फ्रेमवर्क XCTest का उपयोग करेंगे। मुख्य बिंदु यह है कि परीक्षण कंटेनर के अंदर चलने चाहिए, जिसकी अन्य कंटेनरों तक पहुंच हो।
Vapor अनुप्रयोग के लिए परीक्षण का उदाहरण:
\n\nimport XCTest\n@testable import App\nimport Vapor\n\nfinal class UserIntegrationTests: XCTestCase {\n\n var app: Application!\n\n override func setUp() async throws {\n app = try await Application.make(.testing)\n try await configure(app)\n\n // प्रत्येक परीक्षण से पहले डेटाबेस माइग्रेशन\n try await app.autoMigrate()\n }\n\n override func tearDown() async throws {\n try await app.autoRevert()\n try await app.asyncShutdown()\n }\n\n func testCreateAndFetchUser() async throws {\n // API के माध्यम से उपयोगकर्ता बनाएं\n let userDTO = UserDTO(name: "Alice", email: "alice@test.com")\n try await app.test(.POST, "/users", beforeRequest: { req in\n try req.content.encode(userDTO)\n }, afterResponse: { res in\n XCTAssertEqual(res.status, .created)\n let createdUser = try res.content.decode(User.self)\n XCTAssertEqual(createdUser.name, "Alice")\n })\n\n // जाँचें कि उपयोगकर्ता डेटाबेस में सहेजा गया है\n try await app.test(.GET, "/users/\\(aliceID)", afterResponse: { res in\n XCTAssertEqual(res.status, .ok)\n let fetchedUser = try res.content.decode(User.self)\n XCTAssertEqual(fetchedUser.email, "alice@test.com")\n })\n }\n}\n\nयह परीक्षण एप्लिकेशन शुरू करता है, कंटेनर के अंदर वास्तविक सर्वर पर HTTP अनुरोध करता है और प्रतिक्रियाओं की जाँच करता है। डॉकर सुनिश्चित करता है कि प्रत्येक रन के लिए डेटाबेस और Redis साफ हों।
\n\n3. मॉक सर्वर और बाहरी निर्भरताओं का अलगाव
\n\nउन्नत स्तर पर, बाहरी API (भुगतान प्रणाली, मौसम सेवाएँ) के साथ बातचीत का परीक्षण करना अक्सर आवश्यक होता है।