Тесты в Go: table-driven и ничего лишнего
В Go тесты — часть языка, не отдельная библиотека. Файл *_test.go, функция TestXxx, команда go test — всё встроено.
func TestAbs(t *testing.T) {
tests := []struct{ in, want int }{
{-3, 3}, {0, 0}, {5, 5},
}
for _, tt := range tests {
if got := Abs(tt.in); got != tt.want {
t.Errorf("Abs(%d) = %d, want %d", tt.in, got, tt.want)
}
}
}Почему таблицей
Табличные тесты — идиома Go. Добавить новый случай — это добавить строку в таблицу, а не копировать целую функцию. Читается компактно и растёт линейно.
Для подтестов есть t.Run(name, func...) — так каждый случай получает имя и запускается изолированно.