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