परिचय: TDD कोई धर्म क्यों नहीं, बल्कि एक जीवन रक्षक है
\n\nकल्पना करें कि आप एक पुराने घर में बिजली के तारों की मरम्मत कर रहे हैं। आप मुख्य स्विच बंद कर देते हैं, लेकिन फिर भी पैनल में हाथ डालने से डरते हैं। एक डेवलपर जो बिना टेस्ट के प्रोजेक्ट में बदलाव करता है, वह लगभग ऐसा ही महसूस करता है। खासकर Go में - एक ऐसी भाषा जहाँ स्टैटिक टाइपिंग सुरक्षा की झूठी भावना देती है।
\n\nGo में टेस्ट-ड्रिवेन डेवलपमेंट (TDD) कोई फैशनेबल ट्रेंड या संप्रदाय का अनुष्ठान नहीं है। यह एक पद्धति है जो रिफैक्टरिंग के डर को आत्मविश्वास में बदल देती है। IBM के एक अध्ययन के अनुसार, TDD वाले प्रोजेक्ट्स में 40% कम दोष पाए जाते हैं। और Go में, जहाँ कंपाइलर पहले ही आधी गलतियों को काट देता है, TDD बाकी 50% को खत्म कर देता है।
\n\nइस लेख में हम व्याख्यान नहीं देंगे। हम एक वास्तविक समस्या लेंगे: हम लिंक शॉर्टनिंग के लिए एक छोटी HTTP सेवा लिखेंगे। और हम TDD का पूरा सफर तय करेंगे - रेड टेस्ट से लेकर ग्रीन और रिफैक्टरिंग तक। चलिए शुरू करते हैं!
\n\nवास्तव में TDD क्या है?
\n\nअगर आपने Red-Green-Refactor के बारे में सुना है - तो आप पहले से ही जानते हैं। अगर नहीं - तो तीन सरल चरण याद रखें:
\n\n- \n
- Red - हम एक ऐसा टेस्ट लिखते हैं जो जानबूझकर फेल होता है (क्योंकि फंक्शनैलिटी अभी मौजूद नहीं है)। \n
- Green - हम न्यूनतम कोड लिखते हैं ताकि टेस्ट पास हो जाए। आदर्श नहीं, बस काम करने वाला। \n
- Refactor - हम कोड को बेहतर बनाते हैं, उसके व्यवहार को बदले बिना। टेस्ट हमारी सुरक्षा हैं। \n
Go में यह चक्र विशेष रूप से सुखद है, इसके बिल्ट-इन पैकेज testing के कारण। आपको jest या pytest इंस्टॉल करने की ज़रूरत नहीं है - सब कुछ पहले से ही स्टैंडर्ड लाइब्रेरी में मौजूद है। लेकिन कई शुरुआती टेस्ट को नज़रअंदाज़ करते हैं, यह सोचकर कि Go वैसे भी "सुरक्षित" है। और यह गलत है।
Go में TDD दूसरी भाषाओं की तुलना में बेहतर क्यों काम करता है?
\n\nGo समुदाय सादगी को पसंद करता है। यहाँ TDD मॉक और स्टब के साथ नौकरशाही में नहीं बदलता। इसके बजाय, आप टेबल-ड्रिवेन टेस्ट (table-driven tests) लिखते हैं - संक्षिप्त, पढ़ने योग्य, समझने योग्य। एक टेस्ट केस - एक पंक्ति। और हाँ, Go टेस्ट तेज़ी से काम करते हैं। सैकड़ों केसों पर मिलीसेकंड - यह सामान्य है।
\n\nवैसे, Go के आधिकारिक ब्लॉग में कई बार जोर दिया गया है: "टेस्ट ही दस्तावेज़ीकरण हैं।" अगर आपका टेस्ट एक स्पेसिफिकेशन की तरह पढ़ा जाता है - तो आप सब कुछ सही कर रहे हैं।
\n\nपर्यावरण सेट अप करना: शुरुआत के लिए क्या चाहिए
\n\nमान लेता हूँ कि आपके पास Go पहले से इंस्टॉल है। अगर नहीं - brew install go या apt install golang-go। वर्जन चेक करें: go version। इस लेख के लिए Go 1.21+ काफी है।
प्रोजेक्ट बनाते हैं:
\n\nmkdir url-shortener-tdd\ncd url-shortener-tdd\ngo mod init url-shortener\n\nहो गया। कोई फ्रेमवर्क नहीं - केवल स्टैंडर्ड लाइब्रेरी और Go टेस्ट-ड्रिवेन डेवलपमेंट।
\n\nपहला टेस्ट लिखना: Red
\n\nमान लीजिए, हम एक फंक्शन Shorten(url string) string चाहते हैं, जो लंबे URL को छोटे हैश में बदल दे। यह अभी मौजूद नहीं है - और यह बहुत अच्छा है। टेस्ट लिखते हैं:
// shortener_test.go\npackage main\n\nimport "testing"\n\nfunc TestShorten(t *testing.T) {\n url := "https://pythonlib.ru/very/long/path?with=params&and=stuff"\n result := Shorten(url)\n\n if len(result) == 0 {\n t.Error("Shorten ने खाली स्ट्रिंग लौटाई")\n }\n\n if len(result) > 10 {\n t.Errorf("छोटे हैश की उम्मीद थी, %d अक्षर मिले", len(result))\n }\n}\n\nचलाते हैं: go test -v। हमें लाल (तकनीकी रूप से - कंपाइलेशन एरर) दिखता है। फंक्शन Shorten मौजूद नहीं है। बढ़िया, हम Red चरण पर हैं।
न्यूनतम कोड: Green
\n\nअब हम उतना ही कोड लिखते हैं जितना टेस्ट पास करने के लिए ज़रूरी है। कोई क्रिप्टोग्राफी नहीं, बस एक हैश:
\n\n// shortener.go\npackage main\n\nimport (\n "crypto/sha256"\n "fmt"\n)\n\nfunc Shorten(url string) string {\n hash := sha256.Sum256([]byte(url))\n return fmt.Sprintf("%x", hash[:4]) // पहले 4 बाइट लेते हैं\n}\n\nटेस्ट फिर से चलाते हैं। ग्रीन? बहुत बढ़िया। लेकिन कोड भयानक है - हैश में टकराव हो सकता है, और हम यह भी नहीं जाँच रहे हैं कि