Go में परीक्षण चलाना: केवल आवश्यक फ़ाइल कैसे चलाएँ? पूर्ण गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

"क्या केवल एक टेस्ट फ़ाइल चलाई जा सकती है?" — हाँ, और यहाँ बताया गया है कि Go में यह कैसे करें

\n\n

क्या आप कभी टर्मिनल के सामने बैठे हैं, go test ./... टाइप कर रहे थे, और डर के साथ देख रहे थे कि आपके Go प्रोजेक्ट का पूरा कोड बेस सैकड़ों परीक्षण चलाना शुरू कर देता है? जबकि आपको केवल एक छोटी सी टेस्ट फ़ाइल की जाँच करनी थी जिसे आपने अभी-अभी लिखा था। परिचित लगता है? यदि हाँ — तो आप सही जगह पर आए हैं।

\n\n

इस लेख में, हम Stack Overflow पर एक लोकप्रिय प्रश्न (वैसे, इसके हज़ारों व्यूज़ हैं) पर चर्चा करेंगे: "How to run test cases in a specified file?" हम उत्तरों को Go डेवलपर की वास्तविकताओं के अनुसार ढालेंगे और न केवल बुनियादी कमांड दिखाएंगे, बल्कि ऐसे लाइफ़हैक्स भी दिखाएंगे जो आपके काम के घंटे बचाएंगे। चलिए शुरू करते हैं!

\n\n

क्यों सिर्फ go test हमेशा उपयुक्त नहीं होता?

\n\n

बड़े प्रोजेक्ट्स में, परीक्षण मॉड्यूलर, इंटीग्रेशन और एंड-टू-एंड में विभाजित होते हैं। यदि आप go test ./... चलाते हैं, तो Go सभी उप-पैकेजों को पुनरावर्ती रूप से पार करता है और सभी पाए गए परीक्षणों को निष्पादित करता है। इसमें मिनट लग सकते हैं। और यदि आपके पास ऐसे परीक्षण हैं जो डेटाबेस या बाहरी API तक पहुँचते हैं, तो वे आपके नियंत्रण से परे कारणों से विफल हो सकते हैं। इसलिए निर्दिष्ट फ़ाइल में टेस्ट-केस चलाने की क्षमता केवल सुविधा नहीं है, बल्कि एक पेशेवर डेवलपर का कौशल है।

\n\n

बुनियादी कमांड: फ़ाइल नाम के साथ go test

\n\n

सबसे सीधा तरीका एक विशिष्ट टेस्ट फ़ाइल निर्दिष्ट करना है। लेकिन यहाँ एक बारीकियाँ हैं: Go की आवश्यकता है कि आप परीक्षण की जाने वाली फ़ाइल और टेस्ट फ़ाइल दोनों को एक साथ निर्दिष्ट करें। क्यों? क्योंकि कंपाइलर को पूरे पैकेज का कोड संकलित करना होता है।

\n\n

मान लीजिए, आपके पास प्रोजेक्ट संरचना है:

\n\n
myproject/\n├── main.go\n└── math_utils.go\n└── math_utils_test.go\n
\n\n

केवल math_utils_test.go से परीक्षण चलाने के लिए, निष्पादित करें:

\n\n
go test -v math_utils.go math_utils_test.go\n
\n\n

फ़्लैग -v (verbose) प्रत्येक टेस्ट-केस के बारे में विस्तृत जानकारी प्रदर्शित करेगा। इसके बिना, आप केवल परिणाम देखेंगे: PASS या FAIL।

\n\n

वास्तविक कोड का उदाहरण

\n\n

एक सरल फ़ाइल math_utils.go बनाते हैं:

\n\n
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:

\n\n
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

एक ही पैकेज में कई फ़ाइलों की समस्या

\n\n

यदि आपके पैकेज में कई फ़ाइलें हैं (उदाहरण के लिए, math_utils.go और strings_utils.go), और math_utils_test.go में परीक्षण strings_utils.go से एक फ़ंक्शन को कॉल करता है, तो उपरोक्त कमांड संकलन त्रुटि के साथ विफल हो जाएगा। Go शिकायत करेगा कि फ़ंक्शन परिभाषित नहीं है।

\n\n

समाधान — सभी आश्रित फ़ाइलों को सूचीबद्ध करना। लेकिन यह असुविधाजनक है। दूसरे दृष्टिकोण का उपयोग करना बेहतर है।

\n\n

उन्नत तरीका: परीक्षणों को नाम से फ़िल्टर करना (-run)

\n\n

फ़्लैग -run आपको केवल उन टेस्ट-केस को चलाने की अनुमति देता है जिनके नाम एक नियमित अभिव्यक्ति से मेल खाते हैं। यह फ़ाइल से बंधा नहीं है, लेकिन यदि आपने परीक्षणों को सार्थक नाम दिए हैं, तो आप आसानी से आवश्यक परीक्षणों को फ़िल्टर कर सकते हैं।

\n\n

उदाहरण: TestSum से शुरू होने वाले सभी परीक्षण चलाएँ:

\n\n
go test -v -run T                

ब्लॉग

पुस्तक अनुशंसाएँ