Swift में परीक्षण: यूनिट, इंटीग्रेशन, E2E — उन्नत स्तर

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Swift में उन्नत परीक्षण: यूनिट, इंटीग्रेशन और E2E

\n\n

परीक्षण केवल जाँच नहीं है, बल्कि विश्वसनीय कोड की नींव है। उन्नत स्तर पर, Swift डेवलपर को केवल टेस्ट लिखने की नहीं, बल्कि परीक्षण पिरामिड को सही ढंग से बनाने की आवश्यकता होती है: तेज़ यूनिट-टेस्ट से लेकर जटिल एंड-टू-एंड (E2E) परिदृश्यों तक। इस लेख में, हम iOS/macOS प्रोजेक्ट्स के लिए उन्नत तकनीकों पर चर्चा करेंगे: निर्भरताओं के साथ काम करना, CoreData इंटीग्रेशन टेस्ट और UI ऑटोमेशन।

\n\n

1. यूनिट-टेस्ट: निर्भरता प्रबंधन और मॉक

\n\n

उन्नत स्तर पर, यूनिट-टेस्ट को पृथक किया जाना चाहिए। मुख्य तकनीक है Dependency Injection (DI)। वास्तविक नेटवर्क लेयर या डेटाबेस का परीक्षण करने के बजाय, हम उन्हें मॉक से बदल देते हैं।

\n\n

उदाहरण: प्रोटोकॉल और DI

\n
protocol NetworkServiceProtocol {\n    func fetchData(completion: @escaping (Result<String, Error>) -> Void)\n}\n\nclass ViewModel {\n    private let networkService: NetworkServiceProtocol\n    \n    init(networkService: NetworkServiceProtocol) {\n        self.networkService = networkService\n    }\n    \n    func loadData() {\n        networkService.fetchData { result in\n            // प्रोसेसिंग\n        }\n    }\n}\n\n// टेस्ट के लिए मॉक\nclass MockNetworkService: NetworkServiceProtocol {\n    var shouldReturnError = false\n    \n    func fetchData(completion: @escaping (Result<String, Error>) -> Void) {\n        if shouldReturnError {\n            completion(.failure(NSError(domain: "test", code: -1)))\n        } else {\n            completion(.success("Mock data"))\n        }\n    }\n}
\n\n

टेस्ट में, आप MockNetworkService बनाते हैं और इसे ViewModel में पास करते हैं। यह वास्तविक API के बिना त्रुटि और सफलता के परिदृश्यों की जाँच करने की अनुमति देता है।

\n\n

एसिंक्रोनस के लिए XCTestExpectation

\n
func testViewModelLoadDataSuccess() {\n    let mock = MockNetworkService()\n    let viewModel = ViewModel(networkService: mock)\n    \n    let expectation = self.expectation(description: "डेटा लोड हुआ")\n    \n    viewModel.loadData()\n    \n    // एसिंक्रोनस कॉल का अनुकरण करें\n    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {\n        expectation.fulfill()\n    }\n    \n    waitForExpectations(timeout: 1.0)\n    // ViewModel की स्थिति जाँचें\n}
\n\n

2. इंटीग्रेशन टेस्ट: CoreData और वास्तविक डेटा के साथ काम करना

\n\n

इंटीग्रेशन टेस्ट घटकों के बीच परस्पर क्रिया की जाँच करते हैं। CoreData के लिए, हम मुख्य डेटाबेस को दूषित न करने के लिए in-memory कंटेनर का उपयोग करते हैं।

\n\n

In-memory CoreData सेटअप

\n
class CoreDataTestStack {\n    lazy var persistentContainer: NSPersistentContainer = {\n        let container = NSPersistentContainer(name: "MyModel")\n        let description = NSPersistentStoreDescription()\n        description.type = NSInMemoryStoreType\n        container.persistentStoreDescriptions = [description]\n        container.loadPersistentStores { _, error in\n            if let error = error {\n                fatalError("स्टोर लोड करने में विफल: \\(error)")\n            }\n        }\n        return container\n    }()\n    \n    var context: NSManagedObjectContext {\n        return persistentContainer.viewContext\n    }\n}
\n\n

इंटीग्रेशन टेस्ट का उदाहरण

\n
func testSaveAndFetchUser() {\n    let stack = CoreDataTestStack()\n    let repository = UserRepository(context: stack.context)\n    \n    // उपयोगकर्ता बनाएँ\n    let user = User(context: stack.context)\n    user.name = "टेस्ट उपयोगकर्ता"\n    user.age = 30\n    \n    try? stack.context.save()\n    \n    // जाँचें कि डेटा सहेजा गया\n    let fetchRequest: NSFetchRequest<User> = User.fetchRequest()\n    let users = try? stack.context.fetch(fetchRequest)\n    \n    XCTAssertEqual(users?.count, 1)\n    XCTAssertEqual(users?.first?.name, "टेस्ट उपयोगकर्ता")\n}
\n\n

महत्वपूर्ण: प्रत्येक टेस्ट के बाद कॉन्टेक्स्ट साफ़ करें ताकि टेस्ट एक-दूसरे को प्रभावित न करें।

ब्लॉग

पुस्तक अनुशंसाएँ