Вопрос с собеседования · Go

Как пишут тесты в Go — табличные тесты, моки, бенчмарки?

JuniorМодули, тесты и инструменты
Ещё спрашивают так:
  • Что такое 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 минут бесплатно.

Разбор собеседования