Какие методологии тестирования используются
Что проверяют
Умеете ли вы тестировать Go-код инструментами самого языка и понимаете ли, какой уровень тестов что ловит. Следом обычно просят показать table-driven тест или рассказать, как вы подменяете базу и внешние сервисы.
Как отвечать
Начните с пирамиды: много быстрых юнит-тестов, меньше интеграционных, совсем мало сквозных. Дальше по уровням с инструментами:
- юнит-тесты: пакет
testing, файлы_test.go, запускgo test ./.... Идиома Go это table-driven тесты с подтестами черезt.Run, плюсt.Parallel()для независимых кейсов иt.Cleanupдля освобождения ресурсов. Для проверок часто берутtestify(require,assert); - моки: зависимости принимаются как маленькие интерфейсы, подмена пишется руками или генерируется
mockgenизgo.uber.org/mock(исходныйgolang/mockбольше не развивается); - интеграционные: реальная база в контейнере через
testcontainers-go, HTTP-обработчики черезhttptest.NewRecorderиhttptest.NewServer. Их отделяют build-тегом//go:build integrationили проверкойtesting.Short(); - конкурентность: прогон с
-raceв CI, для кода с таймерами пакетtesting/synctest; - фаззинг: встроен с Go 1.18, функция
FuzzXxx(f *testing.F)иgo test -fuzz. Хорошо находит паники на разборе входных данных; - бенчмарки:
BenchmarkXxx(b *testing.B),go test -bench . -benchmem, сравнение прогонов черезbenchstat. Нагрузку на сервис целиком дают внешними инструментами вродеk6илиvegeta.
Методологии в узком смысле тоже назовите: TDD, BDD (в Go это Ginkgo и Gomega), контрактное тестирование между сервисами.
Где спотыкаются
Мокают всё подряд, включая базу, и получают тесты, которые проверяют сами моки. SQL-запрос надёжнее проверять на настоящем PostgreSQL в контейнере.
Не знают про кэш тестов: go test ./... не перезапускает пакет без изменений и печатает (cached). Для принудительного прогона нужен -count=1.
Считают, что -race доказывает отсутствие гонок. Детектор видит только гонки на путях, которые реально выполнились, и замедляет прогон в разы, поэтому его включают в CI, но не в прод-сборку.