Mysql
 sql >> база данни >  >> RDS >> Mysql

Разработка, насочена към тестване, за проверка на включените методи в заявките към базата данни

Имах подобен въпрос неотдавна, когато рефакторирах някои от моите собствени тестове и има няколко начина, по които можете да го направите:

a) Предоставете експортиран тип и Open или Connect функция, която го връща - напр.

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
}

... и след това всяка ваша тестове, функции за настройка на запис и разрушаване, които връщат екземпляр на *DB на които дефинирате функциите на вашата база данни (като методи - т.е. 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
}

Обърнете внимание, че това е донякъде тестване за „интеграция“, но аз силно предпочитам да тествам срещу „истинска“ база данни, тъй като подигравката на интерфейса няма да ви помогне да откриете проблеми с вашите заявки/синтаксис на заявки.

b) Алтернативата, макар и по-малко разширяема от страна на приложението, е да има глобален db *sql.DB променлива, която инициализирате в init() във вашите тестове—тъй като тестовете нямат гарантиран ред, ще трябва да използвате init() – и след това изпълнете тестовете си оттам. т.е.

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)
   ...
}

Можете да намерите някои практически примери в repo на GitHub на drone.io , а също бих препоръчал тази статия за структуриране на Go приложения (особено нещата от 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. Използване на предишна папка с данни на MySQL при нова инсталация на MySQL

  2. Как да намерите имейл с повече от 2 точки с помощта на функцията REGEXP MySQL?

  3. Как да добавя обща сума като последен ред в моя sql?

  4. MYSQL скрипт за преобразуване на имената на колоните в малки букви

  5. По избор месец или ден в полето за дата на MySQL от PHP