Как пишут тесты в Go — табличные тесты, моки, бенчмарки?
- Что такое table-driven tests?
Тесты — функции TestXxx(t *testing.T) в файлах _test.go, запуск go test ./.... Идиома — табличные тесты: срез случаев и t.Run для каждого. Зависимости подменяют через маленькие интерфейсы и рукописные фейки. Бенчмарки — BenchmarkXxx(b *testing.B), go test -bench.
- t.Parallel — параллельные подтесты
- httptest — тестовый HTTP-сервер и ResponseRecorder
- go test -race -cover — гонки и покрытие
А ещё testify — популярная библиотека утверждений, но стандартного testing хватает
Подробно
Табличные тесты делают добавление случая одной строкой и дают понятные имена подтестов в выводе.
Подмена зависимостей. В Go нет популярных «магических» моков: сервис принимает интерфейс Store, в тесте передаётся простая структура-фейк. Генераторы моков (mockgen, mockery) используют, когда интерфейсы большие.
Интеграционные тесты — Testcontainers для Go, тег сборки //go:build integration, TestMain для общей подготовки.
Бенчмарки: цикл for b.Loop() (Go 1.24) или for i := 0; i < b.N; i++, -benchmem показывает аллокации. Фаззинг — FuzzXxx (Go 1.18).
Пример
func TestParse(t *testing.T) {
tests := []struct {
name string
in string
want int
wantErr bool
}{
{"число", "42", 42, false},
{"пробелы", " 7 ", 7, false},
{"мусор", "x", 0, true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := Parse(tt.in)
if (err != nil) != tt.wantErr {
t.Fatalf("err = %v", err)
}
if got != tt.want {
t.Errorf("got %d, want %d", got, tt.want)
}
})
}
}Что хотят услышать
- Структура тестов и go test.
- Табличные тесты.
- Подмена зависимостей через интерфейсы.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Для тестов в Go нужен сторонний фреймворк
- ✗Тесты запускаются командой go run
- ✓TestXxx в _test.go, табличные тесты через t.Run
- ✗Табличные тесты — антипаттерн в Go, каждый случай пишут отдельной функцией
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.