Go: Автоматическое тестирование
Теория: Использование testing.TB и вспомогательных функций
Когда тестов в проекте становится много, в них начинает повторяться один и тот же код: проверка значений, проверка ошибок, вывод сообщений. Такое дублирование мешает читать и поддерживать тесты. В Go есть удобный приём: вынести повторяющиеся проверки во вспомогательные функции, или хелперы.
Чтобы такие хелперы были универсальными и работали не только в обычных тестах (*testing.T), но и в бенчмарках (*testing.B), в стандартной библиотеке есть общий интерфейс testing.TB.
Что такое testing.TB
TB — это интерфейс, который описывает всё поведение теста: логирование, падение, пропуск, отметку ошибки.
Выглядит он так:
Главное: и *testing.T, и *testing.B реализуют этот интерфейс. Поэтому если функция принимает t testing.TB, её можно вызывать и в тестах, и в бенчмарках.
Пример: без хелпера и с ним
Функция Max:
тест:
Три раза повторяется одно и то же сравнение.
Вынесем проверку в хелпер:
Теперь тест выглядит компактно:
Почему нужен t.Helper()
Если его убрать, Go покажет ошибку в строке внутри assertEqual, а не там, где он был вызван. С ним же ошибка «поднимается» в настоящий тест, и сразу видно, какой именно кейс упал.
Хелперы для ошибок
Функция Divide:
тест:
Хелпер для ошибок:
Тест становится аккуратным:
Хелперы для разных типов
Можно делать хелперы для любых проверок:
Что такое бенчмарки
Бенчмарк — это тест не на правильность, а на скорость. Обычный тест проверяет «функция работает верно или нет»,а бенчмарк отвечает на вопрос «насколько быстро она работает».
Пример:
Запуск:
Вывод:
Здесь 0.300 ns/op — время одного вызова в наносекундах.
Хелперы и бенчмарки
Так как и *testing.T, и *testing.B реализуют testing.TB, хелперы можно использовать и там, и там.
Один и тот же код проверок работает в тестах и в бенчмарках.
Итог
testing.TB— общий интерфейс для тестов и бенчмарков.- Хелперы (
assertEqual,assertErrorи т.п.) позволяют вынести повторяющийся код. t.Helper()нужно, чтобы ошибки указывали на строку вызова, а не на сам хелпер.- Бенчмарки проверяют скорость работы кода, и в них тоже можно использовать хелперы.
Так тесты становятся чище, бенчмарки — удобнее, а проект — поддерживаемее.



