Как тестировал код с завязкой на БД

«Как тестировал код с завязкой на БД» — вопрос из категории Тестирование, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для тестирования кода с зависимостью от БД в Go обычно используют:

  1. Тестовые контейнеры (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)
    // тесты с реальной БД
}
  1. In-memory БД типа SQLite для простых случаев:
func TestWithSQLite(t *testing.T) {
    db, _ := sql.Open("sqlite3", ":memory:")
    defer db.Close()
    // быстрые изолированные тесты
}
  1. 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)
    // тестируем без реальной БД
}

Лучшие практики:

  • Использовать транзакции в тестах для отката изменений
  • Загружать фикстуры перед тестами
  • Для интеграционных тестов поднимать отдельную тестовую БД