← ко всем постам
2026-06-30 · #tooling

Тесты в 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...) — так каждый случай получает имя и запускается изолированно.