सामान्य टेस्ट क्यों काम नहीं करते, और BDD क्या है
\nहर iOS डेवलपर ने इस स्थिति का सामना किया है: आपने सौ यूनिट-टेस्ट लिखे, कवरेज 90% है, लेकिन अगले डेमो में मैनेजर कहता है: "इस बटन पर क्लिक करने पर कुछ क्यों नहीं होता?" आप कोड देखते हैं – सब कुछ काम कर रहा है। समस्या यह है कि यूनिट-टेस्ट कोड की जाँच करते हैं, सिस्टम के व्यवहार की नहीं। यहाँ BDD (Behaviour-Driven Development) मदद करता है – एक पद्धति जो "तकनीकी" परीक्षण और "व्यावसायिक तर्क" के बीच की रेखा को मिटा देती है।
\nSwift पर BDD सिर्फ एक फैशनेबल शब्द नहीं है। यह टेस्ट लिखने का एक तरीका है ताकि उन्हें न केवल डेवलपर, बल्कि विश्लेषक, परीक्षक या ग्राहक भी पढ़ सके। इस लेख में, हम देखेंगे कि कैसे behaviour-driven development को अपने iOS प्रोजेक्ट में शामिल करें, Quick और Nimble फ्रेमवर्क का उपयोग करके, और Swift पर लाइव उदाहरण दिखाएंगे।
\n\nसरल शब्दों में BDD क्या है
\nकल्पना करें कि आप टेस्ट नहीं, बल्कि एक फिल्म की स्क्रिप्ट लिख रहे हैं। स्क्रिप्ट में पात्र (उपयोगकर्ता, सिस्टम), घटनाएँ (बटन दबाना, अनुरोध भेजना) और अपेक्षित परिणाम (अलर्ट दिखना, UI अपडेट होना) होते हैं। BDD आपके एप्लिकेशन के लिए ऐसी ही "स्क्रिप्ट" है।
\nमुख्य विचार: टेस्ट को उपयोगकर्ता के दृष्टिकोण से सिस्टम के व्यवहार का वर्णन करना चाहिए। "विधि saveUser() true लौटाती है" के बजाय आप लिखते हैं "जब उपयोगकर्ता सही ईमेल दर्ज करता है और 'सहेजें' दबाता है, तो सिस्टम 'सफल' संदेश दिखाता है"।
\n\nBDD, TDD से कैसे अलग है
\nकई लोग BDD को TDD (Test-Driven Development) समझ लेते हैं। अंतर सरल है:
\n- \n
- TDD – पहले टेस्ट लिखें, फिर कोड, फिर रिफैक्टरिंग। ध्यान कार्यान्वयन की शुद्धता पर है। \n
- BDD – पहले व्यवहार स्क्रिप्ट लिखें, फिर कोड जो उस व्यवहार को लागू करता है। ध्यान उपयोगकर्ता के लिए मूल्य पर है। \n
BDD, TDD का विकास है। यदि TDD इस प्रश्न का उत्तर देता है "क्या कोड सही ढंग से काम करता है?", तो BDD पूछता है "क्या कोड वह करता है जो व्यवसाय को चाहिए?"।
\n\nSwift पर BDD के लिए उपकरण
\nSwift की दुनिया में behaviour-driven development के लिए दो मुख्य स्तंभ हैं:
\n- \n
- Quick – BDD शैली में टेस्ट लिखने के लिए फ्रेमवर्क। यह मानक XCTest को बदलता है और describe/context/it सिंटैक्स प्रदान करता है। \n
- Nimble – "मैचर्स" (जाँच) के लिए लाइब्रेरी। XCTAssertEqual के बजाय आप expect(value).to(equal(5)) लिखते हैं – यह अंग्रेजी वाक्य की तरह पढ़ा जाता है। \n
ये उपकरण एक साथ बहुत अच्छा काम करते हैं और आपको ऐसे टेस्ट लिखने की अनुमति देते हैं जो एक विनिर्देश की तरह दिखते हैं।
\n\nSwift Package Manager के माध्यम से Quick और Nimble की स्थापना
\nअपने Package.swift या Xcode के माध्यम से निर्भरताएँ जोड़ें: File → Add Packages → Quick रिपॉजिटरी का URL दर्ज करें: https://github.com/Quick/Quick.git और Nimble: https://github.com/Quick/Nimble.git।
Package.swift के लिए उदाहरण:
// swift-tools-version:5.9\nimport PackageDescription\n\nlet package = Package(\n name: "MyApp",\n dependencies: [\n .package(url: "https://github.com/Quick/Quick.git", from: "7.0.0"),\n .package(url: "https://github.com/Quick/Nimble.git", from: "13.0.0"),\n ],\n targets: [\n .target(name: "MyApp"),\n .testTarget(\n name: "MyAppTests",\n dependencies: ["MyApp", "Quick", "Nimble"]\n )\n ]\n)\n\n\nSwift पर पहला BDD-टेस्ट लिखना
\nमान लीजिए हमारे पास एक सरल LoginService है जो लॉगिन और पासवर्ड की जाँच करता है। एक उबाऊ XCTest लिखने के बजाय, BDD शैली में एक टेस्ट बनाते हैं।
सेवा का कोड (संदर्भ के लिए)
\nclass LoginService {\n func authenticate(username: String, password: String) -> Result<User, LoginError> {\n guard !username.isEmpty else { return .failure(.emptyUsername) }\n guard !password.isEmpty else { return .failure(.emptyPassword) }\n guard pas