TDD सिर्फ एक और फैशनेबल पद्धति क्यों नहीं है, बल्कि आपका नया सुपरहीरो केप है
\n\nकल्पना करें: आप कोड लिख रहे हैं, एक कलाकार की तरह - स्ट्रोक दर स्ट्रोक, लाइन दर लाइन। आपको यकीन है कि सब कुछ शानदार है। लेकिन एक घंटा बीतता है, आप एप्लिकेशन चलाते हैं, और वह एक एरर के साथ क्रैश हो जाता है जिसे ढूंढने में आपको आधा दिन लग जाता। परिचित लग रहा है?
\n\nअब एक और परिदृश्य की कल्पना करें। आप पहले एक टेस्ट लिखते हैं जो निश्चित रूप से फेल होगा। फिर - न्यूनतम कोड ताकि टेस्ट पास हो जाए। और उसके बाद ही - रिफैक्टर करते हैं, सुधारते हैं, लेकिन साफ अंतरात्मा के साथ। इसे ही टेस्ट-ड्रिवन डेवलपमेंट (TDD) कहते हैं, और Kotlin में यह एक वास्तविक आनंद बन जाता है।
\n\nइस लेख में हम उबाऊ व्याख्यान नहीं देंगे। हम एक वास्तविक उदाहरण लेंगे, TDD के तीनों चरणों (Red — Green — Refactor) से गुज़रेंगे और दिखाएंगे कि बिना डर और संकोच के विश्वसनीय कोड कैसे लिखें। तैयार हैं? चलिए शुरू करते हैं!
\n\nTDD: तीन अक्षर जो आपके कोड को बदल देंगे
\n\nTDD (Test-Driven Development) सिर्फ एक तकनीक नहीं है, यह एक दर्शन है। सार सरल है: पहले टेस्ट, फिर कोड। पागलपन लगता है? पहली नज़र में - हाँ। व्यवहार में - डिबगिंग के घंटे बचाता है।
\n\nटेस्ट-ड्रिवन डेवलपमेंट का चक्र
\n\n- \n
- Red — हम एक टेस्ट लिखते हैं जो पास नहीं होता (उसे फेल होना चाहिए)। \n
- Green — हम न्यूनतम कोड लिखते हैं ताकि टेस्ट पास हो जाए। \n
- Refactor — हम कोड में सुधार करते हैं, उसके व्यवहार को बदले बिना। \n
और यह चक्र छोटे-छोटे कदमों में दोहराया जाता है। हर कदम यह विश्वास दिलाता है कि आपने कुछ नहीं तोड़ा। Kotlin में इसके संक्षिप्त सिंटैक्स और नल सेफ्टी के साथ, TDD और भी सुखद हो जाता है।
\n\nउपकरण: Kotlin में TDD के लिए क्या चाहिए
\n\nकोड में गोता लगाने से पहले, आइए अपना शस्त्रागार तैयार करें। Kotlin यूनिट टेस्टिंग के लिए आपको चाहिए:
\n\n- \n
- JUnit 5 — यूनिट टेस्ट के लिए डी-फैक्टो मानक। \n
- MockK — मॉक के लिए लाइब्रेरी, विशेष रूप से Kotlin के लिए बनाई गई (अब null और companion object से कोई समस्या नहीं)। \n
- Gradle या Maven — डिपेंडेंसी मैनेजमेंट के लिए।
build.gradle.kts में जोड़ें:
dependencies {\n testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")\n testImplementation("io.mockk:mockk:1.13.8")\n}\n\n\nतैयार। अब ऐसा कोड लिख सकते हैं जिसे सहकर्मियों को दिखाने में शर्म न आए।
\n\nपहला TDD चक्र लिखना: महत्वाकांक्षी कैलकुलेटर
\n\nशुरुआत क्लासिक से करते हैं - कैलकुलेटर। लेकिन साधारण नहीं, बल्कि स्ट्रिंग ऑपरेशन के सपोर्ट के साथ। कार्य: फंक्शन calculate एक स्ट्रिंग "2 + 3" लेता है और 5 लौटाता है।
चरण 1: Red — फेल होने वाला टेस्ट लिखें
\n\nटेस्ट क्लास बनाएं:
\n\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.Assertions.assertEquals\n\nclass CalculatorTest {\n\n @Test\n fun `should add two numbers`() {\n val calculator = StringCalculator()\n val result = calculator.calculate("2 + 3")\n assertEquals(5, result)\n }\n}\n\n\nचलाएं - टेस्ट फेल हो जाता है, क्योंकि StringCalculator क्लास अभी मौजूद नहीं है। लाल सिग्नल - सब कुछ योजना के अनुसार है।
चरण 2: Green — पास होने के लिए न्यूनतम कोड
\n\nउतना ही कोड लिखें जितना टेस्ट पास कराने के लिए ज़रूरी है। कोई आर्किटेक्चरल फैंसी चीज़ें नहीं:
\n\nclass StringCalculator {\n fun calculate(expression: String): Int {\n val parts = expression.split(" + ")\n return parts[0].toInt() + parts[1].toInt()\n }\n}\n\n\nअब टेस्ट ग्रीन है। वाह! लेकिन कोड अभी बदसूरत है - यह केवल दो संख्याओं के जोड़ के लिए बनाया गया है।
\n\nचरण 3: Refactor — कोड को सुंदर बनाएं
\n\nरिफैक्टर करें, लेकिन व्यवहार न बदलें। विभिन्न ऑपरेशनों का सपोर्ट जोड़ें, लॉजिक को अलग-अलग फंक्शन में निकालें:
\n\nclass StringCalculator {\n fun calculate(expression: String): Int {\n val (a, op, b) =