परिचय: शाश्वत प्रश्न "लेकिन परीक्षण में कुछ कैसे आउटपुट करें?"
\n\nआप Go में एक परीक्षण लिख रहे हैं। तर्क जटिल है, डेटा उलझा हुआ है, और आपको यह देखने की सख्त आवश्यकता है कि अंदर क्या हो रहा है। आप यंत्रवत् fmt.Println("value =", x) लिखते हैं, परीक्षण चलाते हैं... और सन्नाटा देखते हैं। कोई आउटपुट नहीं। परिचित लगता है?
यह प्रश्न शुरुआती (और केवल शुरुआती ही नहीं!) Go डेवलपर्स के बीच Stack Overflow पर सबसे लोकप्रिय में से एक है। ऐसा लगता है कि एक स्ट्रिंग आउटपुट करने से आसान क्या हो सकता है? लेकिन Go परीक्षण की दुनिया में अपने नियम और टूल का एक सज्जनतापूर्ण सेट है। इस लेख में, हम परीक्षणों में आउटपुट के सभी तरीकों का विश्लेषण करेंगे, 2025 के सर्वोत्तम अभ्यासों को व्यवस्थित करेंगे और दिखाएंगे कि गलतियाँ कैसे न करें। चलिए शुरू करते हैं!
\n\nfmt.Println चुप क्यों है? (और यह कब बोलेगा?)
\n\nचलिए सीधे मुद्दे पर आते हैं। जब आप go test कमांड (बिना फ़्लैग के) से परीक्षण चलाते हैं, तो मानक आउटपुट (stdout) दबा दिया जाता है। Go परीक्षक मानता है कि यदि परीक्षण सफलतापूर्वक पास हो गया है, तो उपयोगकर्ता को डीबग जानकारी के ढेर देखने की आवश्यकता नहीं है। यह स्वच्छता और स्वचालन के लिए किया जाता है - कल्पना करें कि यदि CI/CD के प्रत्येक रन पर प्रत्येक परीक्षण 10 लाइनों का लॉग आउटपुट करता है।
हालाँकि, दो अपवाद हैं जब fmt.Println स्क्रीन पर दिखाई देगा:
- \n
- फ़्लैग
-v(verbose):go test -v। यह मोड सभी परीक्षणों का विस्तृत आउटपुट सक्षम करता है। आपकोfmt.Printlnऔर अन्य फ़ंक्शन से संदेश दिखाई देंगे। \n - परीक्षण विफल हुआ: यदि परीक्षण त्रुटि के साथ समाप्त हुआ (
t.Errorयाt.Fatalकॉल किया गया), तो उस परीक्षण सेfmt.Printlnका आउटपुट दिखाया जाएगा। यह डीबगिंग के लिए बहुत उपयोगी है। \n
लेकिन fmt.Println पर निर्भर रहना बुरा व्यवहार है। Go में परीक्षणों के लिए एक विशेष, अधिक सही और शक्तिशाली उपकरण है।
पार्टी का राजा: t.Log() और t.Logf()
\n\nऑब्जेक्ट testing.T (जो प्रत्येक परीक्षण में पास किया जाता है) में लॉगिंग के लिए अंतर्निहित विधियाँ हैं। उन्हें "हमारे पिता" की तरह याद रखें: t.Log() और t.Logf()।
package main\n\nimport (\n "testing"\n)\n\nfunc TestSum(t *testing.T) {\n result := 2 + 2\n // सरल लॉगिंग\n t.Log("योग परीक्षण शुरू कर रहे हैं")\n t.Log("गणना का परिणाम:", result)\n\n // फ़ॉर्मेटिंग के साथ लॉगिंग (fmt.Printf की तरह)\n t.Logf("2 और 2 का योग %d है। जाँच पास!", result)\n\n if result != 4 {\n t.Errorf("4 की उम्मीद थी, %d मिला", result)\n }\n}\n\nइस परीक्षण को -v फ़्लैग के साथ चलाएँ:
go test -v -run TestSum\n\nऔर आप परीक्षण आउटपुट में सुंदर, संरचित संदेश देखेंगे।
\n\nt.Log, fmt.Println से बेहतर क्यों है?
\n- \n
- संदर्भ:
t.Logसे संदेश स्वचालित रूप से विशिष्ट परीक्षण से जुड़ जाते हैं।-vआउटपुट में, आप देखते हैं कि किस परीक्षण ने क्या प्रिंट किया। \n - नियंत्रणीयता:
t.Logका आउटपुट केवल-vया परीक्षण विफल होने पर दिखाया जाता है। इसका मतलब है कि आपके लॉग सामान्य रन के दौरान कंसोल को अव्यवस्थित नहीं करते हैं। \n - सुरक्षा:
fmt.Fprintf(os.Stderr, ...)के विपरीत,t.Logसमानांतर परीक्षणों (t.Parallel) के साथ सही ढंग से काम करता है और race condition का कारण नहीं बनता है। \n
शक्ति का अंधकार पक्ष: आउटपुट टूल के रूप में t.Error() और t.Fatal()
\n\nकई शुरुआती t.Error() का उपयोग केवल त्रुटि होने पर परीक्षण को रोकने के लिए करते हैं। लेकिन वास्तव में यह महत्वपूर्ण नैदानिक जानकारी आउटपुट करने का एक उत्कृष्ट (और सही!) तरीका है, विशेषकर जब परीक्षण विफल होता है।
रहस्य यह है कि t.Error() या t.Fatal() में पास किया गया संदेश हमेशा दिखाया जाएगा, भले ही -v फ़्लैग न हो। यह उन्हें महत्वपूर्ण जानकारी आउटपुट करने के लिए आदर्श बनाता है।