Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pengembangan yang didorong oleh pengujian untuk memeriksa kueri basis data yang melibatkan metode

Saya memiliki pertanyaan serupa belum lama ini ketika memfaktorkan ulang beberapa pengujian saya sendiri, dan ada beberapa cara yang dapat Anda lakukan:

a) Berikan jenis yang diekspor dan Open atau Connect fungsi yang mengembalikannya - mis.

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
}

... lalu masing-masing tes, tulis fungsi penyiapan &pembongkaran yang mengembalikan instance *DB tempat Anda mendefinisikan fungsi basis data Anda (sebagai metode - yaitu 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
}

Perhatikan bahwa ini adalah pengujian "integrasi", tetapi saya lebih suka menguji database "nyata" karena mengejek antarmuka tidak akan membantu Anda menemukan masalah dengan sintaks kueri/kueri Anda.

b) Alternatifnya, meskipun kurang dapat diperluas di sisi aplikasi, adalah memiliki db *sql.DB global variabel yang Anda inisialisasi di init() dalam pengujian Anda—karena pengujian tidak memiliki urutan yang dijamin, Anda harus menggunakan init() —dan kemudian jalankan pengujian Anda dari sana. yaitu

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

Anda dapat menemukan beberapa contoh praktis di repo GitHub drone.io , dan saya juga merekomendasikan artikel tentang penataan aplikasi Go ini (terutama hal-hal 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. Kunci metadata di MySQL 5.7, tidak dapat menemukan proses penguncian?

  2. Urutan Sortir SQL berdasarkan Urutan yang Ditentukan Dalam Kueri

  3. Menggunakan hasil SELECT untuk menjalankan kueri UPDATE dengan Prosedur Tersimpan MySQL

  4. Menguji Kueri MySQL

  5. Menukar nilai kolom di MySQL