【问题标题】:Get the name of the currently executing testing test?获取当前正在执行的测试测试的名称?
【发布时间】:2020-04-22 15:16:46
【问题描述】:

在Go中,如何在不手动传入的情况下获取当前正在执行的测试的名称,即以Test开头的函数名?

【问题讨论】:

  • 您可以在以下链接中找到一些获取函数名称的方法:stackoverflow.com/questions/10742749/…
  • 您应该考虑更改已接受的答案,因为似乎有一种新的方法可以做到这一点。

标签: go


【解决方案1】:

只需使用Name() 方法:

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

这是docs,这是code

【讨论】:

  • 这似乎是新的?无论哪种方式,这现在都应该是例外的答案。
  • 这就是答案
【解决方案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

【讨论】:

【解决方案3】:

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

假设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}

【讨论】:

  • 他*这是什么?
猜你喜欢
  • 2010-10-03
  • 2018-06-18
  • 2010-09-07
  • 2011-12-09
  • 2011-03-11
  • 1970-01-01
  • 2012-01-12
  • 2012-09-26
  • 1970-01-01
相关资源
最近更新 更多