Назад к вопросам
Junior
253
questionbank
Чем юнит-тесты отличаются от интеграционных тестов?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Юнит-тесты проверяют отдельные, изолированные модули кода (функции, методы, пакеты) без внешних зависимостей. Интеграционные тесты проверяют взаимодействие между несколькими модулями или подсистемами, включая зависимости (базы данных, внешние сервисы). Главное отличие — область покрытия и изоляция. Юнит-тесты изолированы, быстрые и помогают выявить ошибки в конкретном элементе. Интеграционные затрагивают взаимодействие, медленнее, но выявляют проблемы интеграции.
| Признак | Юнит-тесты | Интеграционные тесты |
|---|---|---|
| Область проверки | Отдельный модуль (функция, метод) | Взаимодействие модулей/подсистем |
| Изоляция | Высокая (моки, стабы) | Низкая (включает зависимости) |
| Скорость | Быстрые | Медленные |
| Цель | Проверка логики модуля | Проверка взаимодействия и интеграции |
| Количество | Большое | Меньшее |
| Сложность | Низкая | Выше |
Пример юнит-теста в Go:
// package service
//
// func Add(a, b int) int {
// return a + b
// }
package service_test
import "testing"
func TestAdd(t *testing.T) {
result := service.Add(2, 3)
if result != 5 {
t.Errorf("Expected 5, got %d", result)
}
}
Пример интеграционного теста (проверяет взаимодействие с базой данных):
// package repository
//
// import "database/sql"
//
// type User struct {
// ID int
// Name string
// }
//
// func GetUserByID(db *sql.DB, id int) (*User, error) {
// row := db.QueryRow("SELECT id, name FROM users WHERE id = ?", id)
// user := &User{}
// err := row.Scan(&user.ID, &user.Name)
// if err != nil {
// return nil, err
// }
// return user, nil
// }
package repository_test
import (
"database/sql"
"testing"
_ "github.com/mattn/go-sqlite3" // Пример драйвера БД
)
func TestGetUserByID_Integration(t *testing.T) {
// Подключение к тестовой БД (или in-memory БД)
db, err := sql.Open("sqlite3", ":memory:")
if err != nil {
t.Fatalf("Failed to open database: %v", err)
}
defer db.Close()
// Создание схемы и вставка тестовых данных
_, err = db.Exec("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);")
if err != nil {
t.Fatalf("Failed to create users table: %v", err)
}
_, err = db.Exec("INSERT INTO users (id, name) VALUES (1, 'Alice');")
if err != nil {
t.Fatalf("Failed to insert user data: %v", err)
}
// Вызов функции репозитория, зависящей от БД
user, err := repository.GetUserByID(db, 1)
if err != nil {
t.Errorf("Error getting user: %v", err)
}
if user == nil || user.ID != 1 || user.Name != "Alice" {
t.Errorf("Unexpected user data: %+v", user)
}
}