2016-02-21 64 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} 
相关问题