Перейти к основному содержимому

Один тест, много случаев

Большинству функций нужна одна и та же проверка для многих входных данных: обычные значения, отрицательные значения, ноль, граничные случаи. Если скопировать тест пять раз, получится пять мест, которые придётся поддерживать.

Подход Go — табличный тест: поместите случаи в срез структур, где каждый случай хранит имя, входные данные и ожидаемый результат, и пройдите по ним одним циклом.

Добавление нового случая превращается в одну новую строку таблицы. Это самый распространённый шаблон тестирования, который вы встретите в реальном коде на Go.


Таблица

Таблица — это срез анонимных структур, объявленный прямо внутри теста. Каждая запись — один тест-кейс: имя (для сообщения о падении теста), входные данные и ожидаемый результат.

Цикл вызывает функцию по одному разу для каждого случая и сообщает о каждом несовпадении через t.Errorf — поэтому видны все сломанные случаи, а не только первый.

Четыре случая в одной таблице

Четыре случая, один цикл, одна проверка. Здесь все проходят. Чтобы проверить пятую ситуацию, вы добавите одну строку в таблицу — цикл останется нетронутым.

Prompt
Напиши на Go табличный тест для функции Add: срез анонимных структур с именем тест-кейса, двумя входными значениями типа int и ожидаемым результатом, покрывающий случаи one plus one, positive and negative, both negative и zeros. Пройди по таблице в цикле и сообщай о несовпадениях через t.Errorf, включая имя тест-кейса. Покажи вывод go test -v.
Вывод: программа на Go и захваченный вывод
Four cases in one table

Подтесты с t.Run

t.Run(name, func(t *testing.T) { … }) превращает каждый случай таблицы в отдельный подтест. Имена случаев теперь появляются в выводе go test -v, например TestAdd/both_negative (пробелы заменяются на подчёркивания).

Каждый подтест проходит или падает сам по себе, поэтому сломанный случай легко заметить в длинной таблице.

Каждый случай получает имя

Та же таблица, обёрнутая в t.Run. В подробном выводе теперь перечислены все четыре случая по отдельности — видно, какие именно случаи выполнились и прошли.

Prompt
Напиши такой же табличный тест на Go для функции Add, но запусти каждый тест-кейс как подтест через t.Run с именем этого тест-кейса, чтобы каждый случай отображался отдельно в подробном выводе. Покажи вывод go test -v со всеми строками подтестов.
Вывод: программа на Go и захваченный вывод

Запуск одного случая отдельно

Подтесты можно выбирать из командной строки с помощью -run, указывая TestName/subtest_name:

go test -v -run "TestAdd/both_negative"

Запустится только подходящий подтест. Это идеально подходит для исправления одного сломанного случая: перезапускайте только его, пока он не станет зелёным, а затем снова запустите всё.

Фильтрация с помощью -run

Тот же файл, что и выше, запущенный с -run "TestAdd/both_negative". Выполняется только один из четырёх случаев — остальные даже не запускаются.

Prompt
Используя табличный тест на Go для функции Add с подтестами t.Run, покажи вывод запуска только одного тест-кейса командой go test -v -run "TestAdd/both_negative" — должен появиться только этот подтест.
Вывод: программа на Go и захваченный вывод