Go 获取当前正在执行的测试的名称?

Go 获取当前正在执行的测试的名称?,go,Go,在Go中,我如何获得当前测试的当前正在执行的测试的名称,即以test开头的函数名,而不手动传递它?这是一个有趣的问题。定义测试时,传递表示测试本身的结构: func TestSomething(t *testing.T) { 测试.T定义如下: type T struct { common name string // Name of test. startParallel chan bool // Parallel tests will wai

在Go中,我如何获得当前测试的当前正在执行的测试的名称,即以
test
开头的函数名,而不手动传递它?

这是一个有趣的问题。定义测试时,传递表示测试本身的结构:

func TestSomething(t *testing.T) {
测试.T
定义如下:

type T struct {
    common
    name          string    // Name of test.
    startParallel chan bool // Parallel tests will wait on this.
}
因此,结构
t
在名为
name
的字段中有测试的名称。但是,由于某些原因,该名称不会导出,并且没有将返回该名称的公共访问器。因此,您不能直接访问它

有一个变通办法。您可以使用
reflect
包访问未报告的
名称
,并从
t
获取测试名称:

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

// name == "TestSomething"

我不确定这是否是最好的方法,但我无法找到从测试包中访问
name
的另一个合理解决方案。

上述答案非常好。但是,它确实需要您实施。如果只需要方法的名称,请执行以下操作:

假设
t
被定义为:
t*testing.t
,您正在运行一个名为:
TestNetworkProbe
然后打电话:

t.Log("Pass",t)
将生成(向右滚动一点,您将发现…)

只需使用
Name()
方法:

func TestSomethingReallyCool(t*testing.t){
t、 Logf(“测试名称为%s”,t.name())
}

这里是.

你可以在下面的链接中找到一些获取函数名的方法:你应该考虑改变接受的答案,因为似乎有一种新的方式来做这件事。我的方法是检查调用树,但是您的调用树不太容易出错,并且将从不在测试调用堆栈中的例程中工作。这是什么?看起来可能是新的?不管怎样,现在这都应该是例外的答案。这实际上是答案
Pass &{{{{0 0} 0 0 0 0} [] false false false {63642628359 332863663 0x9bdec0} 0 0xc82008e090 0xc82006a300} TestNetworkProbe false 0xc82006a240}