Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Programowanie oparte na testach, aby sprawdzić metody związane z zapytaniami do bazy danych

Niedawno miałem podobne pytanie podczas refaktoryzacji niektórych moich własnych testów i można to zrobić na kilka sposobów:

a) Podaj wyeksportowany typ i Open lub Connect funkcja, która go zwraca - np.

type DB struct {
    db *sql.DB
}

// Using http://jmoiron.github.io/sqlx/ for this example, but
// it has the same interface as database/sql
func Open(opts *Options) (*DB, error) {
    db, err := sqlx.Connect(opts.Driver, fmt.Sprintf("host=%s user=%s dbname=%s sslmode=%s", opts.Host, opts.User, opts.Name, opts.SSL))
    if err != nil {
        return nil, err
    }

    return &DB{db}, nil
}

... a potem każdy z Twoich testy, pisz funkcje konfiguracji i rozkładania, które zwracają instancję *DB na których definiujesz funkcje bazy danych (jako metody - np. func (db *DB) GetUser(user *User) (bool, error) ):

// Setup the test environment.
func setup() (*DB, error) {
    err := withTestDB()
    if err != nil {
        return nil, err
    }

    // testOptions is a global in this case, but you could easily
    // create one per-test
    db, err := Open(testOptions)
    if err != nil {
        return nil, err
    }

    // Loads our test schema
    db.MustLoad()
    return db, nil
}

// Create our test database.
func withTestDB() error {
    db, err := open()
    if err != nil {
        return err
    }
    defer db.Close()

    _, err = db.Exec(fmt.Sprintf("CREATE DATABASE %s;", testOptions.Name))
    if err != nil {
        return err
    }

    return nil
}

Zwróć uwagę, że jest to trochę testowanie „integracyjne”, ale zdecydowanie wolę testować z „prawdziwą” bazą danych, ponieważ wyśmiewanie interfejsu nie pomoże ci wyłapać problemów ze składnią zapytań/zapytań.

b) Alternatywą, chociaż mniej rozszerzalną po stronie aplikacji, jest posiadanie globalnego db *sql.DB zmienna, którą inicjujesz w init() w Twoich testach — ponieważ testy nie mają gwarantowanej kolejności, będziesz musiał użyć init() — i stamtąd uruchom swoje testy. tj.

var db *sql.DB

func init() {
    var err error
    // Note the = and *not* the assignment - we don't want to shadow our global
    db, err = sqlx.Connect(...)
    if err != nil {
        ...
    }

    err := db.loadTestSchema
    // etc.
}

func TestGetUser(t *testing.T) {
   user := User{}
   exists, err := db.GetUser(user)
   ...
}

Kilka praktycznych przykładów można znaleźć w repozycie drone.io na GitHubie , a także polecam ten artykuł o strukturyzacji aplikacji Go (zwłaszcza rzeczy z DB).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wiele kluczy obcych?

  2. Jak połączyć się ze źródłem danych MySQL w Visual Studio

  3. COALESCE w laravel

  4. Google Cloud SQL — BŁĄD 2003 (HY000):Nie można połączyć się z MySQL

  5. Zapytanie MySQL — identyfikowanie danych przy użyciu nazw URL, w których dane są zorganizowane w hierarchię