Swift में परीक्षण: Unit, Integration, E2E — सिद्धांत से व्यवहार तक
गुणवत्तापूर्ण परीक्षण iOS और macOS के तहत डेवलपमेंट में केवल "अच्छा व्यवहार" नहीं है, बल्कि एक महत्वपूर्ण चरण है जो एप्लिकेशन की स्थिरता, सुरक्षा और पूर्वानुमेयता सुनिश्चित करता है। इस लेख में हम Swift में परीक्षण के तीन स्तरों पर चर्चा करेंगे: Unit-परीक्षण, एकीकरण परीक्षण और E2E (end-to-end)। आप जानेंगे कि वे कैसे भिन्न हैं, उन्हें कब लागू करना है और XCTest और XCUITest फ्रेमवर्क का उपयोग करके प्रभावी परीक्षण कैसे लिखें।
1. Unit-परीक्षण: एप्लिकेशन के "बिल्डिंग ब्लॉक्स" की जाँच
Unit-परीक्षण सबसे निम्न-स्तरीय और सबसे तेज़ प्रकार के परीक्षण हैं। वे बाहरी निर्भरताओं (नेटवर्क, डेटाबेस, UI) से अलग करके अलग-अलग फंक्शन, मेथड या क्लास (यूनिट) के काम की जाँच करते हैं।
Swift में Unit-परीक्षण के मूल सिद्धांत:
- पृथक्करण: परीक्षण किया गया कोड अन्य मॉड्यूल की स्थिति पर निर्भर नहीं होना चाहिए।
- पुनरावृत्ति क्षमता: परीक्षण को हर बार चलाने पर समान परिणाम देना चाहिए।
- गति: हजारों unit-परीक्षण सेकंडों में पूरे होने चाहिए।
XCTest के साथ Unit-परीक्षण का उदाहरण:
import XCTest
class Calculator { func add(_ a: Int, _ b: Int) -> Int { return a + b } func divide(_ a: Int, _ b: Int) throws -> Int { guard b != 0 else { throw CalculationError.divisionByZero } return a / b }}
enum CalculationError: Error { case divisionByZero}
class CalculatorTests: XCTestCase { var calculator: Calculator! override func setUp() { super.setUp() calculator = Calculator() } override func tearDown() { calculator = nil super.tearDown() } func testAddition() { // Given let a = 5 let b = 3 // When let result = calculator.add(a, b) // Then XCTAssertEqual(result, 8, "5 + 3 का मान 8 होना चाहिए") } func testDivisionByZeroThrowsError() { // अपवादों की जाँच के लिए XCTAssertThrowsError का उपयोग करें XCTAssertThrowsError(try calculator.divide(10, 0)) { error in XCTAssertEqual(error as? CalculationError, .divisionByZero) } }}Unit-परीक्षण के लिए सर्वोत्तम अभ्यास:
- AAA (Arrange-Act-Assert) पैटर्न का उपयोग करें — तैयारी, क्रिया, जाँच।
- परीक्षणों को सार्थक नाम दें:
testMethodName_condition_expectedResult। - private मेथड का परीक्षण करने से बचें — सार्वजनिक इंटरफ़ेस का परीक्षण करें।
- मॉक और स्टब के लिए प्रोटोकॉल और dependency injection का उपयोग करें।
2. एकीकरण परीक्षण: घटकों के बीच अंतःक्रिया की जाँच
एकीकरण परीक्षण जाँचते हैं कि एप्लिकेशन के विभिन्न मॉड्यूल एक साथ कैसे काम करते हैं। iOS के संदर्भ में, यह ViewModel का नेटवर्क, Core Data या UserDefaults के साथ अंतःक्रिया हो सकती है।
नेटवर्क लेयर के मॉक के साथ एकीकरण परीक्षण का उदाहरण:
import XCTest
// नेटवर्क सेवा के लिए प्रोटोकॉल (आसानी से बदलने की अनुमति देता है)protocol NetworkServiceProtocol { func fetchUser(id: Int, completion: @escaping (Result<User, Error>) -> Void)}
// वास्तविक सेवा (हम इसका एकीकरण परीक्षण में परीक्षण नहीं करते)class RealNetworkService: NetworkServiceProtocol { func fetchUser(id: Int, completion: @escaping (Result<User, Error>) -> Void) { // वास्तविक HTTP अनुरोध }}
// परीक्षण के लिए Mock-सेवाclass MockNetworkService: NetworkServiceProtocol { var shouldReturnError = false var mockUser = User(id: 1, name: "Test User") func fetchUser(id: Int, completion: @escaping (Result<User, Error>) -> Void) { if shouldReturnError { completion(.failure(NSError(domain: "test", code: 500)))