Назад к вопросам
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)
	}
}