Получить доступ

Как пишут тесты в 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 хватает

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Табличные тесты делают добавление случая одной строкой и дают понятные имена подтестов в выводе.

Подмена зависимостей. В 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.
  • Табличные тесты.
  • Подмена зависимостей через интерфейсы.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем