Ответ
Интеграционные тесты проверяют, как несколько компонентов системы работают вместе как единое целое. В отличие от юнит-тестов, которые проверяют функции в изоляции (часто с использованием моков), интеграционные тесты задействуют реальные зависимости, такие как база данных, кэш, файловая система или другие микросервисы.
Основная цель — выявить ошибки на стыках компонентов: в логике взаимодействия, форматах данных, конфигурации и сетевых вызовах.
Пример в 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).
- Скорость: Значительно медленнее юнит-тестов.
- Надежность: Дают большую уверенность в работоспособности системы в целом.