testify
Тема дорожной карты · Golang
Testify — наиболее широко используемый сторонний набор инструментов для тестирования Go, предоставляющий пакеты assert, require, suite и mock в составе github.com/stretchr/testify, которые дополняют стандартный пакет testing выразительными утверждениями и mock-инфраструктурой. Функции пакета assert — assert.Equal(t, expected, actual), assert.NoError(t, err) и assert.Contains(t, slice, elem) — при сбое выводят понятные diff-сообщения, которые go test -v отображает без кастомного форматирования ошибок. require повторяет API assert, но вызывает t.FailNow() при первом сбое, немедленно останавливая тест — критически важно, когда последующие утверждения запаникуют на nil-указателе из неудавшегося запроса к базе данных через sqlx или pgx. Пакет mock из Testify интегрируется с интерфейсным Golang-дизайном: mock.On("Save", user).Return(nil) задаёт ожидания, а mock.AssertExpectations(t) проверяет каждый настроенный вызов, покрывая ту же нишу, что и gomock, но с более простым API. Использование библиотеки Testify совместно с табличными тестами, race detector (go test -race) и фаззингом (go test -fuzz) образует полную стратегию Golang-тестирования для продакшен-сервисов.
Как это работает
testify использует stdlib testing-пакет — фреймворк не нужен. Файлы заканчиваются на _test.go; тесты — func TestX(t *testing.T); subtests через t.Run. Table-driven тесты — идиоматический паттерн. Бенчмарки: func BenchmarkX(b *testing.B), запуск go test -bench=.. Моки: опирайтесь на маленькие интерфейсы (Go-интерфейсы duck-typed — легко заменить stub); gomock или mockery — для генерируемых моков. testify — для fluent-ассертов, httptest — для тестов HTTP-handlers.
Когда применять
Table-driven тесты — дефолт: читаемы, легко добавить кейсы. httptest.Server — для тестов HTTP-клиентов; httptest.ResponseRecorder — для тестов handlers. В CI — с -race. testify — если команда предпочитает fluent-ассерты; иначе stdlib t.Errorf достаточен. dockertest или testcontainers-go — для тестов с реальной БД.
Типичные ошибки
Ловушки testify: параллельные тесты (t.Parallel()), делящие state (тонкие race conditions); бенчмарки, оптимизируемые компилятором (присваивайте результаты пакетной sink-переменной); нет -race в CI (data race проскакивают в production); over-mocking — тесты проверяют детали реализации, не поведение.