"क्या केवल एक टेस्ट फ़ाइल चलाई जा सकती है?" — हाँ, और यहाँ बताया गया है कि Go में यह कैसे करें
\n\nक्या आप कभी टर्मिनल के सामने बैठे हैं, go test ./... टाइप कर रहे थे, और डर के साथ देख रहे थे कि आपके Go प्रोजेक्ट का पूरा कोड बेस सैकड़ों परीक्षण चलाना शुरू कर देता है? जबकि आपको केवल एक छोटी सी टेस्ट फ़ाइल की जाँच करनी थी जिसे आपने अभी-अभी लिखा था। परिचित लगता है? यदि हाँ — तो आप सही जगह पर आए हैं।
इस लेख में, हम Stack Overflow पर एक लोकप्रिय प्रश्न (वैसे, इसके हज़ारों व्यूज़ हैं) पर चर्चा करेंगे: "How to run test cases in a specified file?" हम उत्तरों को Go डेवलपर की वास्तविकताओं के अनुसार ढालेंगे और न केवल बुनियादी कमांड दिखाएंगे, बल्कि ऐसे लाइफ़हैक्स भी दिखाएंगे जो आपके काम के घंटे बचाएंगे। चलिए शुरू करते हैं!
\n\nक्यों सिर्फ go test हमेशा उपयुक्त नहीं होता?
\n\nबड़े प्रोजेक्ट्स में, परीक्षण मॉड्यूलर, इंटीग्रेशन और एंड-टू-एंड में विभाजित होते हैं। यदि आप go test ./... चलाते हैं, तो Go सभी उप-पैकेजों को पुनरावर्ती रूप से पार करता है और सभी पाए गए परीक्षणों को निष्पादित करता है। इसमें मिनट लग सकते हैं। और यदि आपके पास ऐसे परीक्षण हैं जो डेटाबेस या बाहरी API तक पहुँचते हैं, तो वे आपके नियंत्रण से परे कारणों से विफल हो सकते हैं। इसलिए निर्दिष्ट फ़ाइल में टेस्ट-केस चलाने की क्षमता केवल सुविधा नहीं है, बल्कि एक पेशेवर डेवलपर का कौशल है।
बुनियादी कमांड: फ़ाइल नाम के साथ go test
\n\nसबसे सीधा तरीका एक विशिष्ट टेस्ट फ़ाइल निर्दिष्ट करना है। लेकिन यहाँ एक बारीकियाँ हैं: Go की आवश्यकता है कि आप परीक्षण की जाने वाली फ़ाइल और टेस्ट फ़ाइल दोनों को एक साथ निर्दिष्ट करें। क्यों? क्योंकि कंपाइलर को पूरे पैकेज का कोड संकलित करना होता है।
\n\nमान लीजिए, आपके पास प्रोजेक्ट संरचना है:
\n\nmyproject/\n├── main.go\n└── math_utils.go\n└── math_utils_test.go\n\n\nकेवल math_utils_test.go से परीक्षण चलाने के लिए, निष्पादित करें:
go test -v math_utils.go math_utils_test.go\n\n\nफ़्लैग -v (verbose) प्रत्येक टेस्ट-केस के बारे में विस्तृत जानकारी प्रदर्शित करेगा। इसके बिना, आप केवल परिणाम देखेंगे: PASS या FAIL।
वास्तविक कोड का उदाहरण
\n\nएक सरल फ़ाइल math_utils.go बनाते हैं:
package main\n\nfunc Sum(a, b int) int {\n return a + b\n}\n\nfunc Multiply(a, b int) int {\n return a * b\n}\n\n\nऔर टेस्ट फ़ाइल math_utils_test.go:
package main\n\nimport "testing"\n\nfunc TestSum(t *testing.T) {\n result := Sum(2, 3)\n if result != 5 {\n t.Errorf("Sum(2, 3) = %d; want 5", result)\n }\n}\n\nfunc TestMultiply(t *testing.T) {\n result := Multiply(3, 4)\n if result != 12 {\n t.Errorf("Multiply(3, 4) = %d; want 12", result)\n }\n}\n\n\nअब चलाते हैं:
\n\n$ go test -v math_utils.go math_utils_test.go\n=== RUN TestSum\n--- PASS: TestSum (0.00s)\n=== RUN TestMultiply\n--- PASS: TestMultiply (0.00s)\nPASS\nok command-line-arguments 0.002s\n\n\nआउटपुट पर ध्यान दें: ok command-line-arguments। इसका मतलब है कि Go ने निर्दिष्ट फ़ाइलों से एक अस्थायी पैकेज संकलित किया। यह दृष्टिकोण काम करता है, लेकिन इसकी सीमाएँ हैं।
एक ही पैकेज में कई फ़ाइलों की समस्या
\n\nयदि आपके पैकेज में कई फ़ाइलें हैं (उदाहरण के लिए, math_utils.go और strings_utils.go), और math_utils_test.go में परीक्षण strings_utils.go से एक फ़ंक्शन को कॉल करता है, तो उपरोक्त कमांड संकलन त्रुटि के साथ विफल हो जाएगा। Go शिकायत करेगा कि फ़ंक्शन परिभाषित नहीं है।
समाधान — सभी आश्रित फ़ाइलों को सूचीबद्ध करना। लेकिन यह असुविधाजनक है। दूसरे दृष्टिकोण का उपयोग करना बेहतर है।
\n\nउन्नत तरीका: परीक्षणों को नाम से फ़िल्टर करना (-run)
\n\nफ़्लैग -run आपको केवल उन टेस्ट-केस को चलाने की अनुमति देता है जिनके नाम एक नियमित अभिव्यक्ति से मेल खाते हैं। यह फ़ाइल से बंधा नहीं है, लेकिन यदि आपने परीक्षणों को सार्थक नाम दिए हैं, तो आप आसानी से आवश्यक परीक्षणों को फ़िल्टर कर सकते हैं।
उदाहरण: TestSum से शुरू होने वाले सभी परीक्षण चलाएँ:
go test -v -run T