Pengujian unit di Go sederhana, buat foo_test. pergi impor pengujian dan jalankan go test ./...
. Tapi kemudian ada pertanyaan SQL, kendala, CRUD. dan tiba-tiba Anda membutuhkan PostgresQL, menyiapkan skrip, dan tidak ada yang mudah lagi
Idenya adalah untuk menghindari penyiapan, penginstalan DBMS, dan manajemen kredensial selama mungkin. Mesin unik terikat pada satu sql. DB dengan sql sebanyak-banyaknya. Conn sesuai kebutuhan menyediakan DataSourceName yang unik. Intinya. Satu DataSourceName per pengujian dan Anda memiliki isolasi pengujian penuh dalam waktu singkat
Instalasi
go get github.com/proullon/ramsql
Penggunaan
Katakanlah Anda ingin menguji fungsi LoadUserAddresses
func LoadUserAddresses[db *sql.DB, userID int64] [[]string, error] { query := `SELECT address.street_number, address.street FROM address JOIN user_addresses ON address.id=user_addresses.address_id WHERE user_addresses.user_id = $1;` rows, err := db.Query[query, userID] if err != nil { return nil, err } var addresses []string for rows.Next[] { var number int var street string if err := rows.Scan[&number, &street]; err != nil { return nil, err } addresses = append[addresses, fmt.Sprintf["%d %s", number, street]] } return addresses, nil }_
Gunakan RamSQL untuk mengujinya dalam mesin SQL dalam memori terisolasi sekali pakai
package myproject import [ "database/sql" "fmt" "testing" _ "github.com/proullon/ramsql/driver" ] func TestLoadUserAddresses[t *testing.T] { batch := []string{ `CREATE TABLE address [id BIGSERIAL PRIMARY KEY, street TEXT, street_number INT];`, `CREATE TABLE user_addresses [address_id INT, user_id INT];`, `INSERT INTO address [street, street_number] VALUES ['rue Victor Hugo', 32];`, `INSERT INTO address [street, street_number] VALUES ['boulevard de la République', 23];`, `INSERT INTO address [street, street_number] VALUES ['rue Charles Martel', 5];`, `INSERT INTO address [street, street_number] VALUES ['chemin du bout du monde ', 323];`, `INSERT INTO address [street, street_number] VALUES ['boulevard de la liberté', 2];`, `INSERT INTO address [street, street_number] VALUES ['avenue des champs', 12];`, `INSERT INTO user_addresses [address_id, user_id] VALUES [2, 1];`, `INSERT INTO user_addresses [address_id, user_id] VALUES [4, 1];`, `INSERT INTO user_addresses [address_id, user_id] VALUES [2, 2];`, `INSERT INTO user_addresses [address_id, user_id] VALUES [2, 3];`, `INSERT INTO user_addresses [address_id, user_id] VALUES [4, 4];`, `INSERT INTO user_addresses [address_id, user_id] VALUES [4, 5];`, } db, err := sql.Open["ramsql", "TestLoadUserAddresses"] if err != nil { t.Fatalf["sql.Open : Error : %s\n", err] } defer db.Close[] for _, b := range batch { _, err = db.Exec[b] if err != nil { t.Fatalf["sql.Exec: Error: %s\n", err] } } addresses, err := LoadUserAddresses[db, 1] if err != nil { t.Fatalf["Too bad! unexpected error: %s", err] } if len[addresses] != 2 { t.Fatalf["Expected 2 addresses, got %d", len[addresses]] } }
Selesai. Tidak perlu menjalankan PostgreSQL atau penyiapan. Pengujian Anda diisolasi, dan sesuai dengan alat go
Biner RamSQL
Katakanlah Anda memiliki SQL yang menjelaskan struktur aplikasi Anda
CREATE TABLE IF NOT EXISTS address [id BIGSERIAL PRIMARY KEY, street TEXT, street_number INT]; CREATE TABLE IF NOT EXISTS user_addresses [address_id INT, user_id INT];
Anda mungkin ingin menguji validitasnya
$ go install github.com/proullon/ramsql $ ramsql Query OK. 1 rows affected ramsql> Query OK. 1 rows affected $ echo $? 0_
Fitur
Pengujian unit
- Isolasi penuh antara tes
- Tidak ada pengaturan [baik file atau database]
- Penampilan yang bagus
penguraian SQL
- Validasi skema database
- ALTER validasi file
Tes stres
- Kesalahan penuh sistem file dengan ukuran basis data maksimum yang dapat dikonfigurasi
- Kueri lambat yang dapat dikonfigurasi secara acak
- Pemutusan acak
Kesesuaian
GORM
Jika Anda bermaksud menggunakan ramsql dengan GORM ORM, Anda harus menggunakan driver GORM Postgres. Sebuah contoh kerja akan