Pergi Fakedb Emulasi basis data dalam pengujian

Suatu hari saya menulis tes untuk modul yang berinteraksi dengan database. Saya tidak ingin menautkan modul tes ke database ini - ini menciptakan persyaratan tambahan untuk lingkungan tempat pengujian akan dilakukan. Saya tidak ingin membuat instance dari sql. Tipe baris dengan pelat yang diperlukan sekaligus - bagi saya tipe ini adalah "kotak hitam", dan saya ingin tetap seperti itu. Cari di topik juga tidak menemukan sesuatu yang menarik.


Saya ingin berbagi temuan saya dengan komunitas: dalam distribusi Go utama, ada alat yang hampir siap untuk kebutuhan seperti itu: disebut FakeDb.


Apa yang bisa dilakukan alat ini?


Pada dasarnya, ini adalah basis data yang paling sederhana, tetapi berfungsi penuh sebagai objek DB, dapat membuat tabel, mengisi mereka, dan membuat sampel sederhana dari mereka. Semua tabel yang dibuat bersifat sementara dan ada selama instance FakeDb ada. Selain itu, menunda emulasi saat menjalankan perintah dan pengecualian emulasi tersedia.


Perintah FakeDb


Perintah terdiri dari frasa yang dipisahkan oleh bilah vertikal - |. Frasa adalah kata kunci atau ekspresi dari bentuk "key = value". Di mana kuncinya adalah nama kolom.


Usap
Perintah menghancurkan tabel dan mengembalikan hasil kosong. Selain itu, ini adalah pemeriksaan bahwa tidak ada jalan buntu.
Contoh panggilan:
WIPE


BUAT
Perintah membuat tabel dengan kolom yang ditentukan dari jenis yang ditentukan.


Format panggilan:


CREATE|_|1=,...,N=


Jenis yang didukung:


  • bool
  • nullbool - boolean atau null
  • int32
  • tali
  • nullstring - string atau NULL
  • int64
  • nullint64 - int64 atau NULL
  • float64
  • nullfloat64 - float64 atau NULL
  • datetime
  • antarmuka kosong, mis. jenis apa pun

Contoh panggilan:


CREATE|people|name=string,age=int32,photo=any,dead=bool,bdate=datetime


MASUK
Perintah menambahkan baris ke tabel yang dibuat.


Format panggilan:
INSERT|_|1=,...,N
Selanjutnya, nilainya dapat diatur dalam tiga cara:


  1. Tetapkan nilai secara eksplisit, misalnya 123 .
  2. Tunjukkan "?", Dan berikan nilai sebagai parameter.
  3. Tentukan "? Parameter_name" dan berikan nilainya ke parameter yang dinamai.

Contoh panggilan:


INSERT|people|name=Alice,age=?,photo=?photo


PILIH
Perintah ini memungkinkan Anda untuk memilih semua baris tabel, atau dengan beberapa pilihan.
Format panggilan:


 SELECT|_|1,...,N| SELECT|_|1,...,N|1=?,...,M 

Contoh panggilan:


 SELECT|categories|category_id,category_parent_id,category_name| SELECT|categories|category_id,category_parent_id,category_name|category_parent_id=?parent 

Hasilnya adalah turunan penuh sql.Rows.


TUNGGU
Mensimulasikan penundaan dalam eksekusi suatu perintah. Harus ditambahkan sebelum perintah di atas.
Format panggilan:
WAIT||


Penundaan ditunjukkan sebagai kuantitas dan postfix yang menunjukkan satuan pengukuran: s - detik, n - nanodetik, u - mikrodetik, h - jam, dan sebagainya (fungsi time.ParseDuration () digunakan).


Contoh panggilan:
WAIT|1s|SELECT|categories|category_id,category_parent_id,category_name|


Panik
Melempar pengecualian saat menjalankan perintah.
Format panggilan:
PANIC|_|


Nilai MethodName akan ditempatkan di bidang stmt.panic (ketik fakeStmt).


Contoh panggilan:
PANIC|blablabla|SELECT|categories|category_id,category_parent_id,category_name|


Gunakan


FakeDb dibuat untuk menguji paket "sql" dari pengiriman utama sebagai skrip pengujian . Saya tidak menemukannya dalam paket terpisah. Oleh karena itu, saya memilihnya sendiri dalam sebuah paket dan meletakkannya di sini: gihub .


Diperlukan suntingan kecil untuk menyoroti paket.


Contoh penggunaan


 package packname import ( "fmt" "testing" "io/ioutil" "database/sql" "github.com/a1div0/fakedb" ) func TestFoo(t *testing.T) { fc := &fakedb.FakeConnector{ } db := sql.OpenDB(fc) if db.Driver() != fakedb.Fdriver { t.Error("OpenDB should return the driver of the Connector") return } if _, err := db.Exec("WIPE"); err != nil { t.Error("exec wipe: %v", err) } defer db.Close() db.Exec("CREATE|users|user_email=string,user_id=int64") db.Exec("INSERT|users|user_email=?,user_id=?", "test@email.com", 345) rows, err := db.Query( "SELECT|users|user_id|user_email=?email", sql.Named("email", user_email), ) if err != nil { t.Error(err) } result, err := Foo(rows) //   if err != nil { t.Error(err) } if result != 123 { t.Error(" ,   Foo()   ;)") } } 

Terima kasih atas perhatian anda


PS: Silakan tulis di komentar - apakah Anda menggunakan emulasi basis data dalam tes? Jika demikian, paket mana?

Source: https://habr.com/ru/post/id485280/


All Articles