【发布时间】:2020-04-22 15:16:46
【问题描述】:
在Go中,如何在不手动传入的情况下获取当前正在执行的测试的名称,即以Test开头的函数名?
【问题讨论】:
-
您可以在以下链接中找到一些获取函数名称的方法:stackoverflow.com/questions/10742749/…
-
您应该考虑更改已接受的答案,因为似乎有一种新的方法可以做到这一点。
标签: go
在Go中,如何在不手动传入的情况下获取当前正在执行的测试的名称,即以Test开头的函数名?
【问题讨论】:
标签: go
这是一个有趣的问题。当你定义一个测试时,你传递了一个代表测试本身的结构:
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。
【讨论】:
上面的答案很好。但是,它确实需要您自己实施。如果您只需要方法的名称,请执行以下操作:
假设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}
【讨论】: