Какие инструменты и подходы вы используете для интеграционного тестирования в Go?

Ответ

Для интеграционного тестирования в Go я использую комбинацию инструментов, которые позволяют проверять взаимодействие нескольких компонентов системы.

Основной стек:

  1. Стандартный пакет 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)
        }
    }
  2. 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)
  3. Мокинг зависимостей: Для изоляции тестируемого компонента от его зависимостей я использую:

    • testify/mock: Популярная библиотека для создания мок-объектов.
    • gomock: Мощный фреймворк от Google, который генерирует моки на основе интерфейсов.
  4. sqlmock: Специализированная библиотека для мокинга взаимодействий с SQL-базой данных на уровне драйвера. Полезна, когда нет возможности поднять реальную БД.

  5. CI/CD: Встраиваю запуск интеграционных тестов в пайплайны GitHub Actions или GitLab CI, часто с использованием matrix для параллельного тестирования с разными версиями зависимостей.