Ответ
В Go экосистема тестирования построена вокруг стандартного пакета testing
, который дополняется множеством сторонних библиотек для различных нужд.
1. Стандартная библиотека
-
testing
: Основа всего. Предоставляет базовые возможности для написания тестов (func TestXxx(t *testing.T)
), бенчмарков (func BenchmarkXxx(b *testing.B)
) и примеров. Ключевая идиома — табличные тесты (table-driven tests), которые позволяют проверять множество кейсов в одном тесте.func TestAdd(t *testing.T) { testCases := []struct { name string a, b int expected int }{ {"positive numbers", 2, 3, 5}, {"negative numbers", -2, -3, -5}, {"zero", 0, 0, 0}, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { if result := Add(tc.a, tc.b); result != tc.expected { t.Errorf("Add(%d, %d) = %d; want %d", tc.a, tc.b, result, tc.expected) } }) } }
-
net/http/httptest
: Незаменим для тестирования HTTP-хендлеров. Позволяет создавать фейковые запросы (httptest.NewRequest
) и записывать ответы (httptest.NewRecorder
), не поднимая реальный HTTP-сервер.
2. Популярные сторонние библиотеки
-
testify
: Де-факто стандарт для ассертов (assertions) и моков. Основные пакеты:testify/assert
: Предоставляет функции для проверки условий (assert.Equal
,assert.NoError
,assert.Len
). В случае ошибки тест помечается как проваленный, но продолжает выполнение.testify/require
: Имеет тот же API, что иassert
, но в случае ошибки немедленно останавливает выполнение теста (вызываетt.FailNow()
). Идеально для проверок, без которых дальнейший тест не имеет смысла (например, проверка наnil
перед использованием объекта).testify/mock
: Помогает создавать мок-объекты для имитации зависимостей.
-
gomock
: Фреймворк для мокинга от Google. Он генерирует типобезопасные моки из интерфейсов с помощью утилитыmockgen
. Считается более строгим и мощным для мокинга, чемtestify/mock
. -
go-cmp
: Библиотека от Google для глубокого сравнения объектов. Часто предпочтительнее, чемreflect.DeepEqual
, так как предоставляет гораздо более информативные и читаемые сообщения об ошибках при несовпадении структур. -
ginkgo
/gomega
: Фреймворки для написания тестов в стиле BDD (Behavior-Driven Development). Позволяют писать тесты в более описательном стиле с помощью блоковDescribe
иIt
. Менее идиоматичны для Go, но популярны в командах, пришедших из других экосистем (например, Ruby с RSpec).
Выбор инструментов
- База: Всегда используется стандартный пакет
testing
. - Удобство: Почти всегда добавляется
testify/assert
илиtestify/require
для более читаемых проверок. - Зависимости: Для тестирования компонентов в изоляции используются моки.
gomock
— отличный выбор для генерации моков из интерфейсов,testify/mock
— более простой вариант. - HTTP:
httptest
из стандартной библиотеки — лучший выбор для тестирования HTTP-слоя.