Go: Автоматическое тестирование
Теория: Табличные тесты
Когда мы пишем тесты, часто приходится проверять одну и ту же функцию на разных входных данных. Например, у нас есть функция Max, которая должна возвращать большее из двух чисел. Проверять её только на одном кейсе бессмысленно — надо убедиться, что она работает правильно в разных ситуациях: когда первое число больше, когда второе больше, когда числа равны.
Можно писать отдельный if для каждого случая, но это быстро превращается в дублирование. Чтобы сделать тесты компактнее, Go-разработчики используют приём табличных тестов.
Пример без таблицы
Сначала посмотрим, как будет выглядеть тест:
Вроде всё ок, но три раза повторяется один и тот же код: вызвали функцию, сравнили результат, вывели сообщение. Если кейсов станет 10 или 20 — тест будет раздутым.
Табличный подход
Чтобы не повторяться, сделаем «таблицу кейсов» — срез структур, где каждая структура хранит входные данные и ожидаемый результат.
Плюсы такого подхода:
- Код теста короткий и не повторяется.
- Легко добавить новые кейсы: просто ещё одна строка в таблице.
- Читается как список условий: удобно глазами пробегать, что проверяется.
Ещё один пример: проверка строк
Представим функцию, которая делает первую букву строки заглавной:
Для неё тоже удобно написать табличный тест:
Здесь сразу видно, какие варианты проверяются: обычное слово, короткая строка, пустая строка.
Подтесты (t.Run)
Чтобы ещё удобнее видеть, какой именно кейс сломался, можно запускать каждый сценарий как отдельный подтест. Для этого используется метод t.Run.
Теперь вывод тестов будет выглядеть так:
Очень удобно, когда кейсов много: сразу видно, какой именно вход сломался.
Табличные тесты и ошибки
Обычно вместе с входными данными и результатом в таблицу добавляют и ожидаемую ошибку.
Функция:
Табличный тест:
Таким образом можно в одной таблице описать и успешные сценарии, и сценарии с ошибкой.
Табличные тесты в Go — это мощный приём, который делает код чище и позволяет легко масштабировать проверки. Логика теста описывается всего один раз, а сами сценарии выносятся в таблицу, так что добавление новых случаев сводится к дописыванию строки. Использование t.Run помогает сразу увидеть, какой именно вариант сломался, а значит отладка становится проще. Такой подход одинаково удобен как для обычных функций, так и для функций, которые возвращают ошибки. Именно поэтому табличные тесты считаются одним из самых популярных и практичных паттернов тестирования в Go.



