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

时间:2016-02-21 11:41:11

标签: go

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

3 个答案:

答案 0 :(得分:7)

只需使用Name()方法:

func TestSomethingReallyCool(t *testing.T) {
    t.Errorf("Test name is %s", t.Name())
}

此处为docs,此处为code

答案 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}