Ответ
Для интеграционного тестирования в Go я использую комбинацию инструментов, которые позволяют проверять взаимодействие нескольких компонентов системы.
Основной стек:
-
Стандартный пакет
testing
в связке сhttptest
: Идеально подходит для тестирования HTTP API без запуска реального сервера. Позволяет создавать mock-запросы и проверять ответы.func TestAPIEndpoint(t *testing.T) { req := httptest.NewRequest("GET", "/users/1", nil) w := httptest.NewRecorder() myApiHandler(w, req) if w.Code != http.StatusOK { t.Errorf("Ожидался статус 200, получили %d", w.Code) } }
-
Testcontainers: Ключевой инструмент для тестов, требующих внешних зависимостей (базы данных, брокеры сообщений). Он программно запускает нужные сервисы в Docker-контейнерах на время выполнения тестов и останавливает их после.
// Пример запуска контейнера с PostgreSQL ctx := context.Background() req := testcontainers.ContainerRequest{ Image: "postgres:13-alpine", ExposedPorts: []string{"5432/tcp"}, Env: map[string]string{ "POSTGRES_PASSWORD": "password", }, } pgContainer, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ ContainerRequest: req, Started: true, }) // ... дальше используем контейнер в тестах defer pgContainer.Terminate(ctx)
-
Мокинг зависимостей: Для изоляции тестируемого компонента от его зависимостей я использую:
testify/mock
: Популярная библиотека для создания мок-объектов.gomock
: Мощный фреймворк от Google, который генерирует моки на основе интерфейсов.
-
sqlmock
: Специализированная библиотека для мокинга взаимодействий с SQL-базой данных на уровне драйвера. Полезна, когда нет возможности поднять реальную БД. -
CI/CD: Встраиваю запуск интеграционных тестов в пайплайны GitHub Actions или GitLab CI, часто с использованием
matrix
для параллельного тестирования с разными версиями зависимостей.