Ответ вслух Middle Тесты, бенчмарки и модули обновлено

Как вы тестируете Go-сервис

Вопрос

Расскажите, как устроено тестирование в вашем Go-сервисе: виды тестов, инструменты, что проверяете в CI.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Юнит-тесты табличные, на каждый случай t.Run, независимые случаи помечаю t.Parallel. Зависимости сервиса это маленькие интерфейсы, в тестах передаю фейки, сложные моки генерирую mockgen.

Что должно прозвучать в ответе

  • Юнит-тесты: табличные, t.Run, фейки через интерфейсы

  • HTTP-слой через httptest

  • Интеграционные с настоящей базой (testcontainers или docker compose), build tags или отдельная команда

  • go test -race и покрытие в CI, линтеры (golangci-lint)

  • Бенчмарки для горячих путей, fuzzing для парсеров

  • goleak и synctest для конкурентного кода

Что могут спросить следом

  • Как сделать тесты с базой быстрыми и изолированными?
  • Сколько покрытия достаточно?

Разбор

Юнит-тесты табличные, на каждый случай t.Run, независимые случаи помечаю t.Parallel. Зависимости сервиса это маленькие интерфейсы, в тестах передаю фейки, сложные моки генерирую mockgen. HTTP-обработчики проверяю через httptest.NewRecorder, клиентов внешних API через httptest.NewServer с заготовленными ответами. Репозиторий тестирую на настоящем PostgreSQL в testcontainers: один контейнер на пакет в TestMain, каждый тест в своей транзакции с откатом или своей схеме. В CI go test -race -count=1 ./..., покрытие и golangci-lint, а интеграционные отдельной джобой. Для горячего кода бенчмарки с benchstat, для парсеров fuzzing. Конкурентный код проверяю goleak на утечки горутин, а таймауты в Go 1.25 через synctest без реального ожидания. Покрытие смотрю не как цель, а как подсказку, какие ветки забыли.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.