Что такое интеграционные тесты в Go?

Ответ

Интеграционные тесты проверяют, как несколько компонентов системы работают вместе как единое целое. В отличие от юнит-тестов, которые проверяют функции в изоляции (часто с использованием моков), интеграционные тесты задействуют реальные зависимости, такие как база данных, кэш, файловая система или другие микросервисы.

Основная цель — выявить ошибки на стыках компонентов: в логике взаимодействия, форматах данных, конфигурации и сетевых вызовах.

Пример в Go: Тестирование HTTP-обработчика с реальной тестовой базой данных.

package main

import (
    "net/http"
    "net/http/httptest"
    "testing"

    "github.com/stretchr/testify/assert"
)

// Предположим, у нас есть обработчик, который зависит от базы данных
func UserHandler(db *DB) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // Логика получения пользователя из db и ответа
        w.WriteHeader(http.StatusOK)
        w.Write([]byte("user_data"))
    }
}

func TestUserHandler_Integration(t *testing.T) {
    // 1. Настройка окружения: поднимаем тестовую БД
    db, cleanup := setupTestDatabase(t) // Функция, которая создает и очищает БД
    defer cleanup() // Очистка после теста

    // 2. Создание экземпляра приложения с реальной зависимостью
    handler := UserHandler(db)
    server := httptest.NewServer(handler)
    defer server.Close()

    // 3. Выполнение запроса к тестовому серверу
    resp, err := http.Get(server.URL + "/users/1")
    assert.NoError(t, err)

    // 4. Проверка результата
    assert.Equal(t, http.StatusOK, resp.StatusCode)
    // ... можно добавить проверки тела ответа
}

Ключевые характеристики:

  • Фокус: Взаимодействие между модулями.
  • Окружение: Требуют настройки реального или почти реального окружения (например, Docker-контейнеры с PostgreSQL, Redis).
  • Скорость: Значительно медленнее юнит-тестов.
  • Надежность: Дают большую уверенность в работоспособности системы в целом.