"টেস্টিং" প্যাকেজটি ব্যবহার করে আপনি কীভাবে গো পরীক্ষায় মুদ্রণ করবেন?


129

আমি কিছুতে মুদ্রণের জন্য স্টেটমেন্ট দিয়ে গোতে একটি পরীক্ষা চালিয়ে যাচ্ছি (অর্থাত্ পরীক্ষার ডিবাগিংয়ের জন্য) তবে এটি কিছুই মুদ্রণ করছে না।

func TestPrintSomething(t *testing.T) {
    fmt.Println("Say hi")
}

আমি যখন এই ফাইলে পরীক্ষা পরীক্ষা চালাই, এটি আউটপুট:

ok      command-line-arguments  0.004s

সত্যই এটি মুদ্রণ করার একমাত্র উপায়, যতদূর আমি জানি, এটি টি। এরর () এর মাধ্যমে মুদ্রণ করা, এরকম:

func TestPrintSomethingAgain(t *testing.T) {
    t.Error("Say hi")
}

যার ফলে:

Say hi
--- FAIL: TestPrintSomethingAgain (0.00 seconds)
    foo_test.go:35: Say hi
FAIL
FAIL    command-line-arguments  0.003s
gom:  exit status 1

আমি গুগল করেছি এবং ম্যানুয়ালটি দেখেছি কিন্তু কিছুই পাইনি।


এটি Go 1.14 (Q1 2010) এর পক্ষে সম্ভব হতে পারে। দেখুন নিচের আমার উত্তর
ভোনসি

@ ভনসি এস / বি কিউ
12020

@ ব্যবহারকারী 21৩৩৮১৪ সম্মত হয়েছে, এটি আসলে ২০২০ হওয়া উচিত, ২০১০ নয় below নীচের উত্তরে ২০২০ এর উল্লেখ রয়েছে I নতুন বৈশিষ্ট্যটিতে ডেভ চেনিয়ের নিবন্ধের উল্লেখ সহ আমি উত্তরটি সম্পাদনা করেছি।
ভোনসি

উত্তর:


142

স্ট্রাক্ট testing.Tএবং testing.Bউভয়েরই এমন একটি .Logএবং .Logfপদ্ধতি রয়েছে যা আপনি যা খুঁজছেন তা হতে পারে sound .Logএবং .Logfএকই রকম fmt.Printএবংfmt.Printf যথাক্রমে ।

আরও বিশদ এখানে দেখুন: http://golang.org/pkg/testing/#pkg-index

fmt.Xপ্রিন্ট বিবৃতি না কাজ ভিতরে পরীক্ষা, কিন্তু আপনি পাবেন তাদের আউটপুট সম্ভবত পর্দা যেখানে আপনি তা খুঁজে পেতে আশা উপর অত: পর নয় এবং,, কেন তুমি লগ ইন পদ্ধতি ব্যবহার করা উচিতtesting

যদি আপনার ক্ষেত্রে হিসাবে, আপনি পরীক্ষা করে ব্যর্থ নয়, তাদের জন্য লগ দেখতে চাই, আপনি প্রদান করতে হবে পতাকা (ভারবোসিটি জন্য v)। পরীক্ষাগুলি পতাকা সম্পর্কিত আরও বিশদ এখানে পাওয়া যাবে: https://golang.org/cmd/go/#hdr- পরীক্ষা-নিরীক্ষাgo test-v


15
t.Log () পরীক্ষাটি শেষ হওয়ার পরে দেখাবে না, সুতরাং আপনি যদি কোনও পরীক্ষা হ্যাং বা খারাপভাবে সম্পাদন করে যা ডিবাগ করার চেষ্টা করছেন তবে মনে হয় আপনার এফএমটি ব্যবহার করা দরকার। পরীক্ষা চলাকালীন fmt.Pressln এর আউটপুট দেখানোর জন্য go test -v ব্যবহারের জন্য পিটারএসওর উত্তর দেখুন।
ভুটসাউরাস

142

উদাহরণ স্বরূপ,

package verbose

import (
    "fmt"
    "testing"
)

func TestPrintSomething(t *testing.T) {
    fmt.Println("Say hi")
    t.Log("Say bye")
}

go test -v
=== RUN TestPrintSomething
Say hi
--- PASS: TestPrintSomething (0.00 seconds)
    v_test.go:10: Say bye
PASS
ok      so/v    0.002s

কমান্ড যাও

পতাকা পরীক্ষার বিবরণ

-v
Verbose output: log all tests as they are run. Also print all
text from Log and Logf calls even if the test succeeds.

প্যাকেজ পরীক্ষা

ফানক (* টি) লগ

func (c *T) Log(args ...interface{})

লগ ডিফল্ট ফর্ম্যাটিং ব্যবহার করে এর আর্গুমেন্টগুলি ফর্ম্যাট করে, প্রিন্টলনের সাথে সমতুল্য এবং ত্রুটি লগটিতে পাঠ্যটি রেকর্ড করে। পরীক্ষাগুলির জন্য, পরীক্ষাটি ব্যর্থ হলে বা -স্টেস্ট.ভি পতাকাটি সেট করা থাকলেই পাঠ্যটি মুদ্রণ করা হবে। মানদণ্ডগুলির জন্য, পাঠ্যটি সর্বদা টেস্ট.ভি ফ্ল্যাগের মানের উপর নির্ভরশীলতা এড়াতে মুদ্রণ করা হয়।


21
verboseআমি যা খুঁজছিলাম
cevaris

2
মোদোডে লগ আউটপুটটি দেখার জন্য আপনি নিজেই পরীক্ষা করছেন
ফিলিটি_উইজার্ড

7

t.Log()পরীক্ষা শেষ হওয়ার পরে দেখাবে না, সুতরাং আপনি যদি কোনও পরীক্ষা হ্যাং বা খারাপভাবে সম্পাদন করে যা ডিবাগ করার চেষ্টা করছেন তবে মনে হয় আপনার এটি ব্যবহার করা দরকার fmt

হ্যাঁ: এটি ছিল 1.13 (আগস্ট 2019) পর্যন্ত অন্তর্ভুক্ত case

এবং এটি 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সম্পন্ন করা হয়।
পরীক্ষাগুলি যদি কাজ করে তবে এটি ঠিক আছে, তবে যদি কিছু প্রকারের বাগ থাকে তবে এমন কয়েকটি ক্ষেত্রে রয়েছে যেখানে বাফারিং লগ আউটপুট সমস্যাযুক্ত:

  • স্থানীয়ভাবে পুনরাবৃত্তি করার সময়, আমি পরিবর্তন করতে সক্ষম হতে চাই, আমার পরীক্ষা চালাতে পারি, লগগুলিতে কী ঘটছে তা তাত্ক্ষণিকভাবে দেখুন, পরীক্ষা প্রয়োজন তাড়াতাড়ি বন্ধ করতে সিটিআরএল + সি চাপুন, আবার পরিবর্তন করুন, পুনরায়- পরীক্ষা চালানো, ইত্যাদি।
    যদি TestFooধীর হয় (উদাহরণস্বরূপ, এটি একটি ইন্টিগ্রেশন পরীক্ষা), আমি পরীক্ষার একেবারে শেষ না হওয়া পর্যন্ত লগ আউটপুট পাই না। এটি উল্লেখযোগ্যভাবে পুনরাবৃত্তি হ্রাস করে।
  • যদি TestFooকোনও বাগ থাকে যা এর ফলে এটি ঝুলতে পারে এবং কখনই সম্পূর্ণ হয় না, আমি কোনও লগ আউটপুট পাব না। এই ক্ষেত্রে t.Logএবং এগুলি মোটেই t.Logfকার্যকর নয়।
    এটি ডিবাগিংকে খুব কঠিন করে তোলে।
  • তদুপরি, আমি কেবল লগ আউটপুট পাই না, তবে পরীক্ষাটি যদি খুব বেশি সময় ঝুলে থাকে, হয় গো পরীক্ষার সময়সীমাটি 10 ​​মিনিটের পরে পরীক্ষাটি মেরে ফেলবে, বা আমি যদি সময়সীমা বাড়িয়ে দিই, অনেক সিআই সার্ভারগুলি পরীক্ষা না করেও শেষ করে দিবে যদি না থাকে নির্দিষ্ট সময়ের পরে লগ আউটপুট (উদাহরণস্বরূপ, সার্কেলসিআই-তে 10 মিনিট)।
    সুতরাং এখন আমার পরীক্ষাগুলি মারা গেছে এবং আমাকে কী হয়েছে তা বলার জন্য লগগুলিতে আমার কিছুই নেই।

তবে (সম্ভবত) Go 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

এটি ডেভ চেনি " go test -vস্ট্রিমিং আউটপুট " -তে সত্যায়িত হিসাবে, এটি আসলে গো 1.14 তে রয়েছে :

যান 1.14 সালে go test -vস্ট্রিম হবে t.Logআউটপুট যেমন বরং পরীক্ষা রান শেষে তিল এটা মজুদ করার পরিবর্তে, ঘটে

অধীন যেতে 1.14 fmt.Printlnএবং t.Logলাইন আছে ইন্টারলিভড্ , বরং সম্পূর্ণ পরীক্ষা জন্য অপেক্ষা, যে পরীক্ষা আউটপুট যখন প্রবাহিত হয় প্রদর্শক চেয়ে go test -vব্যবহৃত হয়।

ডেভ অনুসারে সুবিধা:

এটি সংহত শৈলীর পরীক্ষাগুলির জন্য জীবনের উন্নতির একটি দুর্দান্ত মানের যা পরীক্ষায় ব্যর্থ হলে প্রায়শই দীর্ঘ সময়ের জন্য পুনরায় চেষ্টা করে।
স্ট্রিমিং t.Logআউটপুট গোফারদের তাদের আউটপুট প্রাপ্তির জন্য পুরো পরীক্ষার সময় শেষ না হওয়া পর্যন্ত পরীক্ষার ব্যর্থতার ডিবাগ করতে সহায়তা করবে।



2

t.Logএবং t.Logfআপনার পরীক্ষায় প্রিন্ট আউট করবেন তবে এটি পরীক্ষার মতো একই লাইনে প্রিন্ট করায় এটি প্রায়শই মিস হতে পারে। আমি যা করি তা হ'ল তাদের এমনভাবে লগ করুন যা তাদেরকে দাঁড় করায়, অর্থাত্‍

t.Run("FindIntercomUserAndReturnID should find an intercom user", func(t *testing.T) {

    id, err := ic.FindIntercomUserAndReturnID("test3@test.com")
    assert.Nil(t, err)
    assert.NotNil(t, id)

    t.Logf("\n\nid: %v\n\n", *id)
})

যা এটি টার্মিনালে প্রিন্ট করে,

=== RUN   TestIntercom
=== RUN   TestIntercom/FindIntercomUserAndReturnID_should_find_an_intercom_user
    TestIntercom/FindIntercomUserAndReturnID_should_find_an_intercom_user: intercom_test.go:34:

        id: 5ea8caed05a4862c0d712008

--- PASS: TestIntercom (1.45s)
    --- PASS: TestIntercom/FindIntercomUserAndReturnID_should_find_an_intercom_user (1.45s)
PASS
ok      github.com/RuNpiXelruN/third-party-delete-service   1.470s

-2

*_test.goফাইল অন্যদের মত একটি যান উৎস, যদি আপনি জটিল ডাটা স্ট্রাকচার, এখানে একটি উদাহরণ ডাম্প করার প্রয়োজন হয়, নতুন এটির প্রত্যেক সময় আরম্ভ করতে পারেন:

// initZapLog is delegated to initialize a new 'log manager'
func initZapLog() *zap.Logger {
    config := zap.NewDevelopmentConfig()
    config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
    config.EncoderConfig.TimeKey = "timestamp"
    config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
    logger, _ := config.Build()
    return logger
}

তারপরে, প্রতিবার, প্রতিটি পরীক্ষায়:

func TestCreateDB(t *testing.T) {
    loggerMgr := initZapLog()
    // Make logger avaible everywhere
    zap.ReplaceGlobals(loggerMgr)
    defer loggerMgr.Sync() // flushes buffer, if any
    logger := loggerMgr.Sugar()
    logger.Debug("START")
    conf := initConf()
    /* Your test here
    if false {
        t.Fail()
    }*/
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.