Ответ
Для тестирования кода с зависимостью от БД в Go обычно используют:
- Тестовые контейнеры (testcontainers-go) - запускают реальную БД в Docker:
func TestWithPostgres(t *testing.T) {
ctx := context.Background()
pg, _ := testcontainers.NewPostgresContainer(ctx)
defer pg.Terminate(ctx)
dbURL, _ := pg.ConnectionString(ctx)
db, _ := sql.Open("postgres", dbURL)
// тесты с реальной БД
}
- In-memory БД типа SQLite для простых случаев:
func TestWithSQLite(t *testing.T) {
db, _ := sql.Open("sqlite3", ":memory:")
defer db.Close()
// быстрые изолированные тесты
}
- Mock-объекты через интерфейсы:
type DB interface {
GetUser(id int) (*User, error)
}
func TestWithMock(t *testing.T) {
mockDB := new(MockDB)
mockDB.On("GetUser", 1).Return(&User{Name: "Test"}, nil)
// тестируем без реальной БД
}
Лучшие практики:
- Использовать транзакции в тестах для отката изменений
- Загружать фикстуры перед тестами
- Для интеграционных тестов поднимать отдельную тестовую БД