Go परीक्षणों में डेटा कैसे आउटपुट करें: 2025 में t.Log() और t.Logf() के रहस्य

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

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

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

परिचय: शाश्वत प्रश्न "लेकिन परीक्षण में कुछ कैसे आउटपुट करें?"

\n\n

आप Go में एक परीक्षण लिख रहे हैं। तर्क जटिल है, डेटा उलझा हुआ है, और आपको यह देखने की सख्त आवश्यकता है कि अंदर क्या हो रहा है। आप यंत्रवत् fmt.Println("value =", x) लिखते हैं, परीक्षण चलाते हैं... और सन्नाटा देखते हैं। कोई आउटपुट नहीं। परिचित लगता है?

\n\n

यह प्रश्न शुरुआती (और केवल शुरुआती ही नहीं!) Go डेवलपर्स के बीच Stack Overflow पर सबसे लोकप्रिय में से एक है। ऐसा लगता है कि एक स्ट्रिंग आउटपुट करने से आसान क्या हो सकता है? लेकिन Go परीक्षण की दुनिया में अपने नियम और टूल का एक सज्जनतापूर्ण सेट है। इस लेख में, हम परीक्षणों में आउटपुट के सभी तरीकों का विश्लेषण करेंगे, 2025 के सर्वोत्तम अभ्यासों को व्यवस्थित करेंगे और दिखाएंगे कि गलतियाँ कैसे न करें। चलिए शुरू करते हैं!

\n\n

fmt.Println चुप क्यों है? (और यह कब बोलेगा?)

\n\n

चलिए सीधे मुद्दे पर आते हैं। जब आप go test कमांड (बिना फ़्लैग के) से परीक्षण चलाते हैं, तो मानक आउटपुट (stdout) दबा दिया जाता है। Go परीक्षक मानता है कि यदि परीक्षण सफलतापूर्वक पास हो गया है, तो उपयोगकर्ता को डीबग जानकारी के ढेर देखने की आवश्यकता नहीं है। यह स्वच्छता और स्वचालन के लिए किया जाता है - कल्पना करें कि यदि CI/CD के प्रत्येक रन पर प्रत्येक परीक्षण 10 लाइनों का लॉग आउटपुट करता है।

\n\n

हालाँकि, दो अपवाद हैं जब fmt.Println स्क्रीन पर दिखाई देगा:

\n
    \n
  • फ़्लैग -v (verbose): go test -v। यह मोड सभी परीक्षणों का विस्तृत आउटपुट सक्षम करता है। आपको fmt.Println और अन्य फ़ंक्शन से संदेश दिखाई देंगे।
  • \n
  • परीक्षण विफल हुआ: यदि परीक्षण त्रुटि के साथ समाप्त हुआ (t.Error या t.Fatal कॉल किया गया), तो उस परीक्षण से fmt.Println का आउटपुट दिखाया जाएगा। यह डीबगिंग के लिए बहुत उपयोगी है।
  • \n
\n\n

लेकिन fmt.Println पर निर्भर रहना बुरा व्यवहार है। Go में परीक्षणों के लिए एक विशेष, अधिक सही और शक्तिशाली उपकरण है।

\n\n

पार्टी का राजा: t.Log() और t.Logf()

\n\n

ऑब्जेक्ट testing.T (जो प्रत्येक परीक्षण में पास किया जाता है) में लॉगिंग के लिए अंतर्निहित विधियाँ हैं। उन्हें "हमारे पिता" की तरह याद रखें: t.Log() और t.Logf()।

\n\n
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 फ़्लैग के साथ चलाएँ:

\n
go test -v -run TestSum
\n\n

और आप परीक्षण आउटपुट में सुंदर, संरचित संदेश देखेंगे।

\n\n

t.Log, fmt.Println से बेहतर क्यों है?

\n
    \n
  • संदर्भ: t.Log से संदेश स्वचालित रूप से विशिष्ट परीक्षण से जुड़ जाते हैं। -v आउटपुट में, आप देखते हैं कि किस परीक्षण ने क्या प्रिंट किया।
  • \n
  • नियंत्रणीयता: t.Log का आउटपुट केवल -v या परीक्षण विफल होने पर दिखाया जाता है। इसका मतलब है कि आपके लॉग सामान्य रन के दौरान कंसोल को अव्यवस्थित नहीं करते हैं।
  • \n
  • सुरक्षा: fmt.Fprintf(os.Stderr, ...) के विपरीत, t.Log समानांतर परीक्षणों (t.Parallel) के साथ सही ढंग से काम करता है और race condition का कारण नहीं बनता है।
  • \n
\n\n

शक्ति का अंधकार पक्ष: आउटपुट टूल के रूप में t.Error() और t.Fatal()

\n\n

कई शुरुआती t.Error() का उपयोग केवल त्रुटि होने पर परीक्षण को रोकने के लिए करते हैं। लेकिन वास्तव में यह महत्वपूर्ण नैदानिक जानकारी आउटपुट करने का एक उत्कृष्ट (और सही!) तरीका है, विशेषकर जब परीक्षण विफल होता है।

\n\n

रहस्य यह है कि t.Error() या t.Fatal() में पास किया गया संदेश हमेशा दिखाया जाएगा, भले ही -v फ़्लैग न हो। यह उन्हें महत्वपूर्ण जानकारी आउटपुट करने के लिए आदर्श बनाता है।

ब्लॉग

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