परिचय: क्यों परीक्षण एक विश्वसनीय स्विफ्ट एप्लिकेशन की नींव है
\n\niOS और macOS के लिए विकास में कोड की उच्च विश्वसनीयता की आवश्यकता होती है। एप्लिकेशन के तर्क में एक त्रुटि उपयोगकर्ता अनुभव को खराब कर सकती है, और वाणिज्यिक परियोजनाओं में पैसे का नुकसान कर सकती है। स्विफ्ट में परीक्षण केवल "अच्छा व्यवहार" नहीं है, बल्कि विकास का एक अनिवार्य चरण है। यह प्रारंभिक चरणों में बग का पता लगाने, रिफैक्टरिंग को सरल बनाने और कोड की गुणवत्ता में सुधार करने की अनुमति देता है।
\n\nइस लेख में, हम परीक्षण के तीन स्तरों पर चर्चा करेंगे: यूनिट (मॉड्यूलर), इंटीग्रेशन (एकीकरण) और ई2ई (एंड-टू-एंड)। आप जानेंगे कि वे कैसे भिन्न हैं, प्रत्येक का उपयोग कब करना है, और XCTest फ्रेमवर्क का उपयोग करके स्विफ्ट में कार्यशील उदाहरण देखेंगे।
1. स्विफ्ट में यूनिट-टेस्टिंग: मूलभूत आधार
\n\nयूनिट टेस्ट अलग-अलग मॉड्यूल (फंक्शन, मेथड, क्लास) को अलगाव में जांचते हैं। उनका मुख्य उद्देश्य यह सुनिश्चित करना है कि कोड की प्रत्येक "इकाई" सही ढंग से काम करती है।
\n\nXCTest सेटअप
\n\nXCTest Xcode में अंतर्निहित है। टेस्ट टार्गेट बनाने के लिए:
\n- \n
- Xcode में प्रोजेक्ट खोलें। \n
- File → New → Target चुनें। \n
- Unit Testing Bundle चुनें। \n
बनाने के बाद, आपको YourAppTests.swift जैसी फ़ाइल मिलेगी।
यूनिट टेस्ट का उदाहरण
\n\nमान लीजिए, हमारे पास छूट की गणना करने वाला एक फंक्शन है:
\n\nfunc calculateDiscount(price: Double, discount: Double) -> Double {\n guard discount >= 0 && discount <= 100 else { return price }\n return price * (1 - discount / 100)\n}\n\n\nहम टेस्ट लिखते हैं:
\n\nimport XCTest\n@testable import YourApp\n\nclass DiscountTests: XCTestCase {\n func testCalculateDiscount_ValidInput() {\n let result = calculateDiscount(price: 1000, discount: 20)\n XCTAssertEqual(result, 800, accuracy: 0.01)\n }\n \n func testCalculateDiscount_InvalidDiscount() {\n let result = calculateDiscount(price: 500, discount: 150)\n XCTAssertEqual(result, 500)\n }\n}\n\n\nयूनिट टेस्ट के लिए Best practices:
\n- \n
- एक टेस्ट — एक जाँच। \n
- सामान्य ऑब्जेक्ट को इनिशियलाइज़ करने के लिए
setUp()का उपयोग करें। \n - नेटवर्क, डीबी या UI पर निर्भरता से बचें — मॉक का उपयोग करें। \n
2. इंटीग्रेशन-टेस्ट: घटकों के बीच बातचीत की जाँच
\n\nइंटीग्रेशन टेस्ट जाँचते हैं कि विभिन्न मॉड्यूल एक साथ कैसे काम करते हैं। उदाहरण के लिए, डेटा मॉडल का नेटवर्क लेयर या CoreData डेटाबेस के साथ इंटरैक्शन।
\n\nउदाहरण: नेटवर्क रिक्वेस्ट का परीक्षण
\n\nहम एक सरल सेवा बनाते हैं:
\n\nclass NetworkService {\n func fetchUser(completion: @escaping (Result<User, Error>) -> Void) {\n // वास्तविक API अनुरोध\n }\n}\n\n\nएक इंटीग्रेशन टेस्ट यह जाँच सकता है कि सेवा वास्तविक सर्वर (या स्थानीय mock-सर्वर) से प्रतिक्रिया को सही ढंग से संसाधित करती है:
\n\nclass NetworkServiceIntegrationTests: XCTestCase {\n var service: NetworkService!\n \n override func setUp() {\n super.setUp()\n service = NetworkService()\n }\n \n func testFetchUser_ReturnsUser() {\n let expectation = self.expectation(description: "Fetch user")\n \n service.fetchUser { result in\n switch result {\n case .success(let user):\n XCTAssertNotNil(user.name)\n case .failure:\n XCTFail("Request failed")\n }\n expectation.fulfill()\n }\n \n waitForExpectations(timeout: 5)\n }\n}\n\n\nमहत्वपूर्ण: इंटीग्रेशन टेस्ट यूनिट टेस्ट की तुलना में धीमे होते हैं, इसलिए इन्हें कम बार चलाया जाता है (उदाहरण के लिए, main में मर्ज करने से पहले)।
\n\n3. XCUITest के साथ E2E-परीक्षण (एंड-टू-एंड)
\n\nE2E-टेस्ट (End-to-End) उपयोगकर्ता की क्रियाओं का अनुकरण करते हैं: बटन दबाना, टेक्स्ट इनपुट करना, UI प्रदर्शन की जाँच करना। स्विफ्ट में इसके लिए