-
Notifications
You must be signed in to change notification settings - Fork 18.4k
Description
Please answer these questions before submitting your issue. Thanks!
What version of Go are you using (go version)?
go version go1.9.2 android/arm64
Does this issue reproduce with the latest release?
Yes (I think 1.9.2 is the latest release)
What operating system and processor architecture are you using (go env)?
GOARCH="arm64"
GOHOSTARCH="arm64"
GOHOSTOS="android"
GOOS="android"
What did you do?
Run the following program with "go test". I would have hoped that the reported error line is in the 2nd call to checkFor3s() in TestHelper(). Instead, the error line is in forEach() (line 9 for me but I think some blank lines may have been eaten below.
I think the problem is that checkFor3s() uses the method forEach which is not marked with t.Helper(). In a more realistic case, forEach would be a non-testing utility method and so would not have the possibility of calling t.Helper().
Perhaps the semantics of t.Helper should be that the displayed error line is in the stack frame above the highest t.Helper() call? That way this example would be fixed, and also it would not be necessary to sprinkle t.Helper() calls everywhere if there are complex testing utility functions.
package helper
import(
"testing"
)
func forEach(data []int, f func(int)) {
for _, i := range data {
f(i)
}
}
func checkFor3s(tb testing.TB, data []int) {
tb.Helper()
forEach(data, func(i int) {
tb.Helper()
if i != 3 {
tb.Error("Saw", i, "instead of 3")
}
})
}
func TestHelper(t *testing.T) {
checkFor3s(t, []int{3, 3, 3, 3})
checkFor3s(t, []int{3, 3, 2, 3})
checkFor3s(t, []int{3, 3, 3, 3})
}