sql >> Databáze >  >> RDS >> Mysql

Testem řízený vývoj pro kontrolu databázových dotazů zahrnoval metody

Podobnou otázku jsem měl nedávno, když jsem refaktoroval některé z mých vlastních testů, a existuje několik způsobů, jak to udělat:

a) Poskytněte exportovaný typ a Open nebo Connect funkce, která jej vrací – např.

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 poté každý z vašich testy, zápis funkcí setup &teardown, které vracejí instanci *DB na kterých definujete své databázové funkce (jako metody - tj. 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
}

Všimněte si, že toto je poněkud „integrační“ testování, ale rozhodně preferuji testování proti „skutečné“ databázi, protože zesměšňování rozhraní vám nepomůže zachytit problémy se syntaxí dotazů/dotazů.

b) Alternativou, i když méně rozšiřitelnou na straně aplikace, je mít globální db *sql.DB proměnnou, kterou inicializujete v init() ve vašich testech – protože testy nemají zaručené pořadí, budete muset použít init() – a odtud spusťte 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)
   ...
}

Některé praktické příklady najdete v úložišti GitHub společnosti drone.io a také bych doporučil tento článek o strukturování aplikací Go (zejména věci DB).



  1. Po instalaci nejnovější verze MySQL se mi zobrazí chyba:#1366 - Nesprávná celočíselná hodnota:'' pro sloupec 'group_id' na řádku 1

  2. mysql-connector-java-8.0.12 :získávání chyby pro časové pásmo serveru „Malay Peninsula Standard Time“

  3. Jak nastavit datumové razítko výchozí hodnoty Postgresql jako 'YYYYMM'?

  4. Výběr všech záznamů, pokud má záznam některé z ID z pole