Ответ
В Go тестирование является неотъемлемой частью экосистемы и поддерживается стандартной библиотекой. Основные подходы:
-
Unit-тесты. Используется стандартный пакет
testing
. Тесты находятся в файлах_test.go
и запускаются командойgo test
.- Табличные тесты (Table-Driven Tests) — это идиоматичный способ для Go, позволяющий проверить множество входных данных и ожидаемых результатов в одном тесте.
func TestAdd(t *testing.T) { cases := []struct { name string a, b int expected int }{ {"positive numbers", 2, 3, 5}, {"negative numbers", -2, -3, -5}, {"zero", 5, 0, 5}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { result := Add(tc.a, tc.b) if result != tc.expected { t.Errorf("Add(%d, %d) = %d; want %d", tc.a, tc.b, result, tc.expected) } }) } }
-
Интеграционные тесты. Проверяют взаимодействие нескольких компонентов системы (например, сервис и база данных). Для изоляции часто используют:
- Docker-контейнеры: с помощью библиотек вроде
testcontainers-go
можно поднять в тесте временную БД или другую зависимость.
- Docker-контейнеры: с помощью библиотек вроде
-
Моки и стабы (Mocks & Stubs). Для изоляции тестируемого кода от внешних зависимостей (API, БД) используются моки. В Go это легко реализуется через интерфейсы. Популярная библиотека —
testify/mock
. -
Бенчмарки. Пакет
testing
также позволяет писать тесты производительности (бенчмарки) с помощьюtesting.B
для измерения скорости выполнения кода и количества аллокаций. -
CI/CD. Все тесты интегрируются в пайплайны CI/CD (например, GitHub Actions, GitLab CI) для автоматического запуска при каждом коммите или перед слиянием веток, что обеспечивает стабильность кодовой базы.