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?
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.
The above answer is great. However, it does require an implementation on your part. In case you just need the name of the method do the following:
Lets say that t
is defined as: t *testing.T
and you are running from a function called: TestNetworkProbe
Then calling:
t.Log("Pass",t)
Will produce (Scroll a little to the right and you shell find...)
Pass &{{{{0 0} 0 0 0 0} [] false false false {63642628359 332863663 0x9bdec0} 0 0xc82008e090 0xc82006a300} TestNetworkProbe false 0xc82006a240}