testing: Helper's highest function call's information should be maintained for any subsequent/nested calls
#23.249 aberto em 26 de dez. de 2017
Métricas do repositório
- Stars
- (133.883 stars)
- Métricas de merge de PR
- (Nenhuma PRs mesclada em 30d)
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})
}