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?
Asked
Active
Viewed 4,484 times
13

Kara
- 6,115
- 16
- 50
- 57

Matt Joiner
- 112,946
- 110
- 377
- 526
-
2You 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
-
1You 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 Answers
24
Just use the Name()
method:
func TestSomethingReallyCool(t *testing.T) {
t.Logf("Test name is %s", t.Name())
}

Francesco Casula
- 26,184
- 15
- 132
- 131
-
1Seems like this might be new? Either way this should be the excepted answer now. – emptyflash May 14 '18 at 00:42
-
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