t.Log()परीक्षण पूरा होने तक नहीं दिखाएंगे, इसलिए यदि आप एक ऐसे परीक्षण को डिबग करने का प्रयास कर रहे हैं जो लटका हुआ है या बुरी तरह से प्रदर्शन कर रहा है तो ऐसा लगता है कि आपको उपयोग करने की आवश्यकता है fmt।
हां: यह गो 1.13 (अगस्त 2019) तक मामला था।
और इसके बाद अंक 24929 जारी किया गयाgolang.org
निम्नलिखित (मूर्खतापूर्ण) स्वचालित परीक्षणों पर विचार करें:
func TestFoo(t *testing.T) {
t.Parallel()
for i := 0; i < 15; i++ {
t.Logf("%d", i)
time.Sleep(3 * time.Second)
}
}
func TestBar(t *testing.T) {
t.Parallel()
for i := 0; i < 15; i++ {
t.Logf("%d", i)
time.Sleep(2 * time.Second)
}
}
func TestBaz(t *testing.T) {
t.Parallel()
for i := 0; i < 15; i++ {
t.Logf("%d", i)
time.Sleep(1 * time.Second)
}
}
अगर मैं दौड़ता हूं go test -v, तो मुझे तब तक कोई लॉग आउटपुट नहीं मिलता हैTestFoo , जब तक कि सभी का काम नहीं हो जाता है , जब तक कि सभी का काम TestBarपूरा नहीं हो जाता है और तब तक कोई और आउटपुट नहीं मिलता TestBazहै।
यह ठीक है अगर परीक्षण काम कर रहे हैं, लेकिन अगर किसी प्रकार का बग है, तो कुछ मामले हैं जहां लॉग आउटपुट बफ़र करना समस्याग्रस्त है:
- स्थानीय रूप से पुनरावृत्त होने पर, मैं एक बदलाव करने में सक्षम होना चाहता हूं, अपने परीक्षण चला रहा हूं, देखें कि क्या हो रहा है, यह समझने के लिए तुरंत लॉग में क्या हो रहा है, यदि आवश्यक हो तो परीक्षण को जल्दी बंद करने के लिए CTRL + C को हिट करें, एक और बदलाव करें, फिर से- परीक्षण चलाते हैं, और इसी तरह।
यदि TestFooधीमा है (उदाहरण के लिए, यह एक एकीकरण परीक्षण है), तो मुझे परीक्षण के बहुत अंत तक कोई लॉग आउटपुट नहीं मिलता है। यह महत्वपूर्ण रूप से चलना धीमा कर देता है।
- अगर
TestFooएक बग है जो इसे लटका देता है और कभी पूरा नहीं होता है, तो मुझे कोई लॉग आउटपुट नहीं मिलेगा। इन मामलों में, t.Logऔर t.Logfइसका कोई फायदा नहीं है।
इससे डिबगिंग बहुत मुश्किल हो जाता है।
- इसके अलावा, न केवल मुझे कोई लॉग आउटपुट नहीं मिलता है, लेकिन यदि परीक्षण बहुत लंबा लटका रहता है, तो या तो गो परीक्षण टाइमआउट 10 मिनट के बाद परीक्षण को मारता है, या यदि मैं उस टाइमआउट को बढ़ाता हूं, तो कई सीआई सर्वर भी परीक्षण को मार देंगे यदि कोई नहीं है एक निश्चित समय (जैसे सर्किल में 10 मिनट) के बाद आउटपुट लॉग करें।
इसलिए अब मेरे परीक्षण मारे गए हैं और मुझे लॉग में कुछ भी नहीं है कि मुझे बताएं कि क्या हुआ।
लेकिन (संभवतः) के लिए 1.14 (Q1 2020) जाओ: सीएल 127120
परीक्षण: वर्बोज़ मोड में स्ट्रीम लॉग आउटपुट
अब आउटपुट है:
=== RUN TestFoo
=== PAUSE TestFoo
=== RUN TestBar
=== PAUSE TestBar
=== RUN TestGaz
=== PAUSE TestGaz
=== CONT TestFoo
TestFoo: main_test.go:14: hello from foo
=== CONT TestGaz
=== CONT TestBar
TestGaz: main_test.go:38: hello from gaz
TestBar: main_test.go:26: hello from bar
TestFoo: main_test.go:14: hello from foo
TestBar: main_test.go:26: hello from bar
TestGaz: main_test.go:38: hello from gaz
TestFoo: main_test.go:14: hello from foo
TestGaz: main_test.go:38: hello from gaz
TestBar: main_test.go:26: hello from bar
TestFoo: main_test.go:14: hello from foo
TestGaz: main_test.go:38: hello from gaz
TestBar: main_test.go:26: hello from bar
TestGaz: main_test.go:38: hello from gaz
TestFoo: main_test.go:14: hello from foo
TestBar: main_test.go:26: hello from bar
--- PASS: TestFoo (1.00s)
--- PASS: TestGaz (1.00s)
--- PASS: TestBar (1.00s)
PASS
ok dummy/streaming-test 1.022s
यह वास्तव में गो 1.14 में है, क्योंकि डेव चेनी " go test -vस्ट्रीमिंग आउटपुट " में शामिल हैं:
1.14 में, आउटपुट कोgo test -v स्ट्रीम करेगा जैसा कि होता है, होर्डिंग के बजाय यह टेस्ट रन के अंत को झुकाता है ।t.Log
गो १.१४ के तहत fmt.Printlnऔर t.Logलाइनों को इंटरलेय किया जाता है , बजाय परीक्षण के पूरा होने के इंतजार के, यह दिखाते हुए कि परीक्षण आउटपुट go test -vका उपयोग किए जाने पर स्ट्रीम किया जाता है।
डेव के अनुसार, लाभ:
यह एकीकरण शैली परीक्षणों के लिए जीवन सुधार का एक बड़ा गुण है जो अक्सर परीक्षण विफल होने पर लंबे समय तक पुन: प्रयास करते हैं।
स्ट्रीमिंग t.Logआउटपुट गोफ़र्स को उन परीक्षण विफलताओं को डिबग करने में मदद करेगा, जब तक कि उनके आउटपुट प्राप्त करने के लिए पूरे परीक्षण समय तक इंतजार न करना पड़े।