13

In Go, how would I get the name of the currently executing test, the function name starting with Test, of the current test without passing it in manually?

Kara
  • 6,115
  • 16
  • 50
  • 57
Matt Joiner
  • 112,946
  • 110
  • 377
  • 526
  • 2
    You can find in the following link some approaches to get the function name: http://stackoverflow.com/questions/10742749/get-name-of-function-using-google-gos-reflection – JesusTinoco Feb 21 '16 at 12:24
  • 1
    You should consider changing the accepted answer as it seems there's a new way of doing this. – Francesco Casula May 16 '18 at 06:14

2 Answers2

24

Just use the Name() method:

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

Here's the docs and here's the code.

Francesco Casula
  • 26,184
  • 15
  • 132
  • 131
4

This is an interesting question. When you define a test, you pass around a struct that represents the test itself:

func TestSomething(t *testing.T) {

testing.T is defined as follows:

type T struct {
    common
    name          string    // Name of test.
    startParallel chan bool // Parallel tests will wait on this.
}

So the struct t has the name of the test in a field called name. However, for some reason, the name is not exported and there is no public accessor that will return it. Therefore, you can't access it directly.

There is a workaround. You can use the reflect package to access the unexported name and get the test name from t:

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

// name == "TestSomething"

I'm not sure if this is the best approach, but I was not able to find another reasonable solution to access name from the testing package.

Simone Carletti
  • 173,507
  • 49
  • 363
  • 364
  • Nice one. My method was to inspect the call tree, but your is much less prone to error, and will work from routines not rooted in Test callstack. https://github.com/anacrolix/missinggo/blob/master/testing.go#L12 – Matt Joiner Feb 22 '16 at 03:09