t.Helper() и когда его вызыватьt.Helper() помечает функцию как вспомогательную. При падении теста стек ошибки укажет не на строку внутри хелпера, а на строку вызова в тесте.Когда вы выносите повторяющиеся проверки в отдельную функцию, Go по умолчанию при падении теста покажет в стеке строку внутри этой функции. Допустим, у вас есть хелпер
assertEqual, который вызывается в двадцати тестах. Тест упал, вы смотрите в лог и видите helper.go:14. Это строка с t.Errorf внутри хелпера. Чтобы понять, какой именно тест сломался, придётся идти по стеку вызовов вручную. Вызов в начале функции говорит Go, что эта функция вспомогательная, и при ошибке нужно показывать не её, а место вызова. Вместо
helper.go:14 вы увидите user_test.go:42, то есть конкретную строку теста, где всё пошло не так:// Без t.Helper() ошибка укажет на строку 3 этой функции
// С t.Helper() ошибка укажет на строку вызова assertEqual в тесте
func assertEqual(t *testing.T, got, want int) {
t.Helper()
if got != want {
t.Errorf("got %d, want %d", got, want)
}
}
Вызывать
t.Helper() нужно в каждой функции, которая сама не является тестом, но содержит вызовы t.Errorf, t.Fatalf или других методов, фиксирующих ошибку. Если хелпер вызывает другой хелпер, пометить нужно оба. Пропуск
t.Helper() не сломает тесты, они будут работать корректно. Но при отладке падений в большом проекте с десятками хелперов отсутствие этой пометки превращает чтение логов в квест. Привычка ставить t.Helper() первой строкой в любой вспомогательной функции экономит время и нервы.🐸 Библиотека Go для собеса