Интеграционные тесты — это тесты, которые проверяют взаимодействие между несколькими компонентами системы. В отличие от unit-тестов, которые изолируют отдельные модули, интеграционные тесты проверяют, как эти модули работают вместе.
Рассмотрим тестирование HTTP-обработчика с реальной базой данных:
// user_handler.go
package api
import (
"database/sql"
"net/http"
)
type UserHandler struct {
DB *sql.DB
}
func (h *UserHandler) GetUser(w http.ResponseWriter, r *http.Request) {
id := r.URL.Query().Get("id")
var name string
err := h.DB.QueryRow("SELECT name FROM users WHERE id = $1", id).Scan(&name)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Write([]byte(name))
}
Соответствующий интеграционный тест:
// user_handler_test.go
package api_test
import (
"database/sql"
"net/http"
"net/http/httptest"
"os"
"testing"
_ "github.com/lib/pq" // драйвер PostgreSQL
)
func TestGetUser_Integration(t *testing.T) {
// Настройка тестовой БД
db, err := sql.Open("postgres", os.Getenv("TEST_DB_DSN"))
if err != nil {
t.Fatalf("failed to connect to test DB: %v", err)
}
defer db.Close()
// Инициализация тестовых данных
_, err = db.Exec("INSERT INTO users (id, name) VALUES ('1', 'Test User')")
if err != nil {
t.Fatalf("failed to insert test data: %v", err)
}
// Создание тестового обработчика
handler := &UserHandler{DB: db}
// Создание тестового запроса
req := httptest.NewRequest("GET", "/user?id=1", nil)
w := httptest.NewRecorder()
// Вызов обработчика
handler.GetUser(w, req)
// Проверка результата
if w.Code != http.StatusOK {
t.Errorf("expected status 200, got %d", w.Code)
}
if w.Body.String() != "Test User" {
t.Errorf("expected 'Test User', got '%s'", w.Body.String())
}
}
В Go принято разделять тесты с помощью build tags:
// +build integration
package api_test
Запуск только интеграционных тестов:
go test -tags=integration ./...
Тестовая БД:
Внешние сервисы:
httptest.Server
для мокирования APIt.Parallel()
где возможноХарактеристика | Unit-тесты | Интеграционные тесты |
---|---|---|
Объем тестирования | Один модуль | Взаимодействие модулей |
Зависимости | Моки/стабы | Реальные/тестовые реализации |
Скорость выполнения | Очень быстрые | Медленные |
Надежность | Высокая | Может зависеть от внешних факторов |
Частота выполнения | При каждом коммите | Перед релизом/ночью |
Интеграционные тесты в Go — это важный слой тестирования, который:
Правильно выстроенный набор интеграционных тестов значительно повышает надежность системы и помогает выявлять проблемы, которые невозможно обнаружить unit-тестами.