Ответ
В Go принят подход, при котором стандартная библиотека является основой для всего, включая тестирование. Однако для удобства и расширения возможностей используются сторонние библиотеки.
1. Стандартная библиотека testing
Это фундамент для любого вида тестирования в Go.
- Юнит-тесты: Функции вида
func TestMyFunction(t *testing.T) { ... }
. - Бенчмарки: Функции вида
func BenchmarkMyFunction(b *testing.B) { ... }
для измерения производительности. - Примеры: Функции вида
func ExampleMyFunction() { ... }
, которые проверяются во время тестов и попадают в документацию. - Параллельное выполнение:
t.Parallel()
для ускорения тестов.
2. Table-Driven Tests (табличные тесты)
Это идиоматический паттерн в Go, а не библиотека. Он позволяет проверить множество входных и выходных данных в одном тесте, делая его чистым и расширяемым.
func TestAdd(t *testing.T) {
testCases := []struct {
name string
a, b int
want int
}{
{"positive", 2, 3, 5},
{"negative", -1, -1, -2},
{"zero", 5, 0, 5},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
got := Add(tc.a, tc.b)
if got != tc.want {
t.Errorf("Add(%d, %d) = %d; want %d", tc.a, tc.b, got, tc.want)
}
})
}
}
3. Популярные сторонние библиотеки
Testify (
github.com/stretchr/testify
): Самая популярная библиотека для улучшения тестов.assert
: Предоставляет удобные функции для проверок (assert.Equal(t, expected, actual)
). В случае ошибки тест помечается как проваленный, но выполнение продолжается.require
: Аналогиченassert
, но в случае ошибки немедленно прерывает выполнение теста (t.FailNow()
).mock
: Мощный инструмент для создания моков (заглушек) на основе интерфейсов.suite
: Позволяет группировать тесты в сьюты (наборы) с общимиSetup
иTeardown
методами.
GoMock (
go.uber.org/mock
): Инструмент от Uber для генерации моков. Он генерирует код моков на основе ваших интерфейсов, что обеспечивает строгую типизацию.httptest
(из стандартной библиотеки): Незаменимый пакет для тестирования HTTP-хендлеров без реального запуска сервера. Он позволяет создавать фейковые запросы (httptest.NewRequest
) и записывать ответы (httptest.NewRecorder
).