在Go中,如何获取当前正在执行的测试的名称,当前测试的函数名称以Test
开头,而不是手动传递它?
答案 0 :(得分:7)
只需使用Name()
方法:
func TestSomethingReallyCool(t *testing.T) {
t.Errorf("Test name is %s", t.Name())
}
答案 1 :(得分:3)
这是一个有趣的问题。定义测试时,传递一个表示测试本身的结构:
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.
}
因此struct t
在名为name
的字段中具有测试名称。但是,由于某种原因,名称未导出,并且没有将返回该名称的公共访问者。因此,您无法直接访问它。
有一种解决方法。您可以使用reflect
包来访问未导出的name
,并从t
获取测试名称:
v := reflect.ValueOf(*t)
name := v.FieldByName("name")
// name == "TestSomething"
我不确定这是否是最佳方法,但我无法找到另一个合理的解决方案来从测试包中访问name
。
答案 2 :(得分:-2)
以上答案很棒。但是,确实需要您执行。如果您只需要方法的名称,请执行以下操作:
让我们说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}