2016-02-21 101 views
2

在Go中,我將如何獲得當前正在執行的測試的名稱,當前測試的函數名稱以Test開頭,而不手動傳遞?獲取當前正在執行的測試測試的名稱?

+2

你可以在下面的鏈接中找到一些獲取函數名的方法:http://stackoverflow.com/questions/10742749/get-名稱的功能-U sing-google-gos-reflection – JesusTinoco

回答

2

這是一個有趣的問題。當你定義一個測試,你繞過表示測試本身的結構:

func TestSomething(t *testing.T) { 

testing.T定義如下:

type T struct { 
    common 
    name   string // Name of test. 
    startParallel chan bool // Parallel tests will wait on this. 
} 

所以結構t在一個領域有測試的名稱稱爲name。但是,出於某種原因,名稱不會被導出,並且沒有公共訪問者將返回它。因此,您無法直接訪問它。

有一種解決方法。您可以使用reflect包訪問未導出name,並從t測試名稱:

v := reflect.ValueOf(*t) 
name := v.FieldByName("name") 

// name == "TestSomething" 

我不知道這是否是最好的方法,但我沒能找到另一種合理的解決方案訪問來自測試包的name

+0

不錯的一個。我的方法是檢查調用樹,但是你不太容易出錯,並且可以在不根植於Test callstack的例程中工作。 https://github.com/anacrolix/missinggo/blob/master/testing.go#L12 –

0

上述答案很好。但是,它確實需要你的一個實現。如果你只需要方法的名稱請執行以下操作:

讓我們說t被定義爲:t *testing.T,你是從一個叫功能運行:TestNetworkProbe 然後美其名曰:

t.Log("Pass",t) 

會產生(向右滾動一下,你的外殼找到...)

Pass &{{{{0 0} 0 0 0 0} [] false false false {63642628359 332863663 0x9bdec0} 0 0xc82008e090 0xc82006a300} TestNetworkProbe false 0xc82006a240} 
相關問題