Kotlin पर BDD: ऐसे टेस्ट लिखें जिन्हें मैनेजर और डेवलपर दोनों पढ़ सकें
\n\nक्या आपने कभी अपने प्रोडक्ट मैनेजर को unit-टेस्ट दिखाया है? संभवतः नहीं। क्योंकि यह पायलट को जेट इंजन का ब्लूप्रिंट दिखाने जैसा है — उपयोगी, लेकिन समझ से परे। Kotlin पर व्यवहार-संचालित विकास (BDD) इसी समस्या का समाधान करता है: यह सूखे assert' को जीवंत परिदृश्यों में बदल देता है जो मानवीय भाषा में सिस्टम के व्यवहार का वर्णन करते हैं।
\n\nइस लेख में, हम देखेंगे कि आधुनिक फ्रेमवर्क — Kotest और Spek — का उपयोग करके Kotlin पर BDD कैसे लागू करें। आप देखेंगे कि Given-When-Then शैली में टेस्ट कैसे लिखें, जो एक साथ दस्तावेज़ीकरण और स्वचालित जाँच दोनों हैं। और हाँ, आपका टीम लीड भी इसे बिना तैयारी के पढ़ सकेगा।
\n\nBDD क्या है और यह TDD से कैसे अलग है?
\n\nकई लोग TDD (टेस्ट-संचालित विकास) और BDD (व्यवहार-संचालित विकास) को भ्रमित करते हैं। अंतर सरल है:
\n\n- \n
- TDD — यह इस बारे में है कि "मैं इस विधि की जाँच कैसे करूँ?" \n
- BDD — यह इस बारे में है कि "उपयोगकर्ता इस सुविधा से मूल्य कैसे प्राप्त करेगा?" \n
व्यवहार-संचालित विकास कार्यान्वयन के विवरण के बजाय सिस्टम के व्यवहार पर ध्यान केंद्रित करता है। आप एक परिदृश्य का वर्णन करते हैं: विशिष्ट शर्तों (Given) पर, जब कोई क्रिया होती है (When), सिस्टम अपेक्षित परिणाम (Then) देता है।
\n\nउदाहरण के लिए, यह लिखने के बजाय: assertEquals(42, calculator.add(20, 22)),
आप यह लिखेंगे:
Given("मेरे पास एक कैलकुलेटर है") {\n val calc = Calculator()\n When("मैं 20 और 22 जोड़ता हूँ") {\n val result = calc.add(20, 22)\n Then("परिणाम 42 होना चाहिए") {\n result shouldBe 42\n }\n }\n}\n\n\nमानिए, दूसरा विकल्प एक कहानी की तरह पढ़ा जाता है, न कि तकनीकी निर्देश की तरह।
\n\nKotlin BDD के लिए आदर्श क्यों है
\n\nKotlin एक ऐसी भाषा है जो स्वाभाविक रूप से पढ़ने योग्य कोड लिखने के लिए प्रेरित करती है। एक्सटेंशन फ़ंक्शन, इनफिक्स नोटेशन, रिसीवर के साथ लैम्ब्डा — ये सब Kotlin पर BDD टेस्ट को अत्यधिक स्वाभाविक बनाते हैं। आप shouldBe, shouldThrow और अन्य मैचर लिख सकते हैं जो अंग्रेजी की तरह दिखते हैं।
इसके अलावा, Kotlin कई प्रतिमानों का समर्थन करता है, जो BDD के लिए विभिन्न फ्रेमवर्क का उपयोग करने की अनुमति देता है। आइए दो सबसे लोकप्रिय पर नज़र डालें।
\n\nKotest फ्रेमवर्क: बिल्ट-इन BDD
\n\nKotest (पहले KotlinTest) एक शक्तिशाली मल्टी-प्लेटफ़ॉर्म टेस्टिंग फ्रेमवर्क है। यह कई शैलियों का समर्थन करता है, जिसमें BehaviorSpec शामिल है, जो BDD के लिए आदर्श है।
\n\nयहाँ Kotest का उपयोग करके एक पूर्ण Kotlin पर BDD परिदृश्य दिखाया गया है:
\n\nimport io.kotest.core.spec.style.BehaviorSpec\nimport io.kotest.matchers.shouldBe\n\nclass CartSpec : BehaviorSpec({\n given("खाली कार्ट") {\n val cart = ShoppingCart()\n `when`("हम 100 मूल्य का उत्पाद जोड़ते हैं") {\n cart.addItem(Item("किताब", 100.0))\n then("कार्ट में 1 उत्पाद होना चाहिए") {\n cart.itemCount shouldBe 1\n }\n then("कुल राशि 100 होनी चाहिए") {\n cart.total shouldBe 100.0\n }\n }\n `when`("हम उत्पाद जोड़ते हैं और 10% छूट लागू करते हैं") {\n cart.addItem(Item("किताब", 100.0))\n cart.applyDiscount(10.0)\n then("अंतिम राशि 90 होनी चाहिए") {\n cart.total shouldBe 90.0\n }\n }\n }\n})\n\n\nwhen के चारों ओर बैकटिक्स पर ध्यान दें। यह Kotlin की एक विशेषता है: when एक आरक्षित शब्द है, लेकिन उद्धरणों में यह एक पहचानकर्ता के रूप में काम करता है। कुछ डेवलपर बड़े अक्षरों में When का उपयोग करना पसंद करते हैं।
Spek: Kotlin के लिए संरचित BDD
\n\nSpek