परिचय: क्यों परीक्षण एक विश्वसनीय Swift अनुप्रयोग की नींव है
iOS और macOS के लिए विकास के लिए न केवल एक सुंदर इंटरफ़ेस की आवश्यकता होती है, बल्कि स्थिर तर्क की भी। Swift में परीक्षण कोई विकल्प नहीं है, बल्कि एक आवश्यकता है। परीक्षणों के बिना, एक छोटा सा बदलाव भी उस कार्यक्षमता को तोड़ सकता है जो वर्षों से काम कर रही थी। इस लेख में, हम परीक्षण के तीन स्तरों का विश्लेषण करेंगे: यूनिट (मॉड्यूलर), एकीकरण (इंटीग्रेशन) और E2E (एंड-टू-एंड)। आप सीखेंगे कि Apple प्लेटफ़ॉर्म पर उन्हें सही तरीके से कैसे कॉन्फ़िगर करें, लिखें और चलाएँ। अंत में - परीक्षण आर्किटेक्चर को व्यवस्थित करने के लिए व्यावहारिक सुझाव।
स्तर 1: यूनिट परीक्षण - मूलभूत आधार
यूनिट परीक्षण अलग-अलग फ़ंक्शन, विधियों या क्लासेस को अलग-थलग करके जाँचते हैं। Swift में मुख्य फ्रेमवर्क XCTest है। यह Xcode में निर्मित है, इसमें तीसरे पक्ष की निर्भरताओं की आवश्यकता नहीं है और यह व्यावसायिक तर्क के परीक्षण के लिए आदर्श है।
पहला यूनिट टेस्ट कैसे लिखें
Xcode में एक नया यूनिट टेस्ट टार्गेट बनाएँ (File → New → Target → Unit Testing Bundle)। फिर एक टेस्ट क्लास जोड़ें:
import XCTest@testable import MyApp
final class CalculatorTests: XCTestCase { var sut: Calculator! override func setUpWithError() throws { sut = Calculator() } override func tearDownWithError() throws { sut = nil } func testAddition() { // Given let a = 5 let b = 3 // When let result = sut.add(a, b) // Then XCTAssertEqual(result, 8, "जोड़ सही होना चाहिए") }}यूनिट परीक्षण के सर्वोत्तम अभ्यास
- अलगाव: प्रत्येक परीक्षण कोड की केवल एक इकाई का परीक्षण करता है। स्थिति को रीसेट करने के लिए
setUpऔरtearDownका उपयोग करें। - नामकरण: पैटर्न
test[Method]_[Condition]_[ExpectedResult]का उपयोग करें। - मॉक और स्टब: बाहरी निर्भरताओं (नेटवर्क, डेटाबेस) के लिए प्रोटोकॉल का उपयोग करें और परीक्षणों में उन्हें बदलें।
- कवरेज: 70-80% कोड कवरेज का लक्ष्य रखें, लेकिन 100% का पीछा न करें - महत्वपूर्ण पथों का परीक्षण करें।
मॉक के साथ उदाहरण
protocol NetworkServiceProtocol { func fetchData(completion: @escaping (Result<Data, Error>) -> Void)}
class MockNetworkService: NetworkServiceProtocol { var shouldReturnError = false func fetchData(completion: @escaping (Result<Data, Error>) -> Void) { if shouldReturnError { completion(.failure(NSError(domain: "test", code: 1))) } else { completion(.success(Data())) } }}
func testFetchDataSuccess() { let mock = MockNetworkService() let viewModel = ViewModel(networkService: mock) mock.shouldReturnError = false viewModel.loadData() XCTAssertTrue(viewModel.isDataLoaded)}स्तर 2: एकीकरण परीक्षण - अंतःक्रिया की जाँच
एकीकरण परीक्षण जाँचते हैं कि सिस्टम के विभिन्न मॉड्यूल एक साथ कैसे काम करते हैं: डेटाबेस + नेटवर्क, UI + व्यावसायिक तर्क, कई सेवाएँ। Swift में इसके लिए वास्तविक (या in-memory) निर्भरताओं के साथ XCTest का उपयोग किया जाता है।
विशिष्ट परिदृश्य: Core Data + Network
import XCTest@testable import MyApp
class UserServiceIntegrationTests: XCTestCase { var coreDataStack: CoreDataStack! var networkService: NetworkService! var userService: UserService! override func setUp() { coreDataStack = CoreDataStack(inMemory: true) // परीक्षणों के लिए in-memory networkService = NetworkService() userService = UserService(coreDataStack: coreDataStack, networkService: networkService) } func testSaveUserFromNetwork() { // एसिंक्रोनस अनुरोध के लिए अपेक्षा बनाएँ let expectation = self.expe