TDD in Swift: ऐसा कोड कैसे लिखें जो टूटे नहीं

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

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

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

"पहले टेस्ट - फिर कोड": यह Swift में क्यों काम करता है?

\n\n

क्या आपने कभी एक ही मॉड्यूल को तीसरी बार फिर से लिखा है क्योंकि "इसे तुरंत लॉन्च करना ज़रूरी था"? या प्रोडक्शन में कोई बग पकड़ा जिसे लिखने के चरण में ही रोकना आसान था? अगर हाँ - तो TDD (Test-Driven Development) की दुनिया में आपका स्वागत है।

\n\n

टेस्ट-ड्रिवन डेवलपमेंट सिर्फ एक फैशनेबल पद्धति नहीं है। यह सोचने का एक तरीका है जो आपको कोड लिखने से पहले यह स्पष्ट करने पर मजबूर करता है कि कोड को कैसे व्यवहार करना चाहिए। Swift में, अपनी सख्त टाइपिंग और शक्तिशाली XCTest फ्रेमवर्क के साथ, TDD रिग्रेशन और अप्रत्याशित क्रैश के खिलाफ एक विश्वसनीय ढाल बन जाता है।

\n\n

इस लेख में, हम वास्तविक उदाहरणों के साथ TDD को समझेंगे, नेटवर्क लेयर और डेटा मॉडल के लिए टेस्ट लिखेंगे, और सबसे महत्वपूर्ण बात - यह समझेंगे कि इस अभ्यास को बिना दर्द के कैसे लागू किया जाए। चलिए शुरू करते हैं!

\n\n

लाल-हरा-रीफैक्टरिंग: चक्र का जादू

\n\n

TDD का आधार तीन चरणों का एक चक्र है:

\n\n
    \n
  • लाल (Red) - हम एक ऐसा टेस्ट लिखते हैं जो पास नहीं होता (क्योंकि कोड अभी मौजूद नहीं है)।
  • \n
  • हरा (Green) - हम न्यूनतम कोड लिखते हैं ताकि टेस्ट पास हो जाए।
  • \n
  • रीफैक्टरिंग (Refactor) - हम कोड को बेहतर बनाते हैं, उसके व्यवहार को बदले बिना (टेस्ट सुरक्षा प्रदान करते हैं)।
  • \n
\n\n

सरल लगता है? Swift पर प्रयास करते हैं।

\n\n

पहला टेस्ट: User मॉडल की जाँच

\n\n

मान लीजिए, हमारे पास एक सरल उपयोगकर्ता मॉडल है। हम चाहते हैं कि यह पूरा नाम सही ढंग से फ़ॉर्मेट करे। पहले - टेस्ट:

\n\n
import XCTest\n@testable import MyApp\n\nfinal class UserTests: XCTestCase {\n    \n    func testFullName_GivenFirstNameAndLastName_ReturnsFormattedString() {\n        // Arrange\n        let user = User(firstName: "अन्ना", lastName: "कैरेनिना")\n        \n        // Act\n        let fullName = user.fullName()\n        \n        // Assert\n        XCTAssertEqual(fullName, "अन्ना कैरेनिना", "पूरा नाम पहले नाम और अंतिम नाम से स्पेस के साथ बना होना चाहिए")\n    }\n}\n
\n\n

चलाते हैं - टेस्ट फेल होता है (लाल)। कंपाइलर शिकायत करता है कि User मौजूद नहीं है। बढ़िया, यही अपेक्षित है।

\n\n

अब टेस्ट पास करने के लिए न्यूनतम कोड लिखते हैं:

\n\n
struct User {\n    let firstName: String\n    let lastName: String\n    \n    func fullName() -> String {\n        return "\\(firstName) \\(lastName)"\n    }\n}\n
\n\n

चलाते हैं - हरा! अब रीफैक्टरिंग पर जा सकते हैं। उदाहरण के लिए, खाली स्ट्रिंग या मिडल नेम को हैंडल करना। लेकिन जल्दी न करें - टेस्ट बताएंगे कि कब इसकी ज़रूरत है।

\n\n

एसिंक्रोनस नेटवर्क लेयर का परीक्षण

\n\n

iOS डेवलपमेंट में सबसे आम समस्याओं में से एक है नेटवर्क के साथ काम करना। TDD यहाँ विशेष रूप से उपयोगी है क्योंकि आप स्पष्ट रूप से लॉजिक को नेटवर्क कॉल से अलग करते हैं।

\n\n

प्रोटोकॉल और mock-ऑब्जेक्ट लिखना

\n\n

पहले परिभाषित करते हैं कि हमारी सेवा कैसी दिखनी चाहिए:

\n\n
protocol WeatherServiceProtocol {\n    func fetchWeather(for city: String, completion: @escaping (Result<Weather, Error>) -> Void)\n}\n
\n\n

अब - टेस्ट। हम वास्तविक API पर निर्भर नहीं होना चाहते, इसलिए एक mock बनाते हैं:

\n\n
class MockWeatherService: WeatherServiceProtocol {\n    var shouldReturnError = false\n    var mockWeather: Weather?\n    \n    func fetchWeather(for city: String, completion: @escaping (Result<Weather, Error>) -> Void) {\n        if shouldReturnError {\n            completion(.failure(NetworkError.serverError))\n        } else if let weather = mockWeather {\n            completion(.success(weather))\n        }\n    }\n}\n\nfinal class WeatherViewModelTests: XCTestCase {\n    \n    func testFetchWeather_Success_UpdatesModel() {\n        // Arrange\n        let mockService = MockWeatherService()\n        mockService.mockWeather = Weather(temperature: 25.0, condition: "धूप")\n        let viewModel = WeatherViewModel(service: mockService)\n        let expectation = XCTestExpectation(description: "मौसम लोड होने की प्रतीक्षा")\n        \n                

ब्लॉग

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