Skip to content

goapt/dbunit

Repository files navigation

数据库单元测试辅助

Build Status codecov Go Report Card
GoDoc

使用

go get github.com/goapt/dbunit

1、单数据库自动辅助测试函数

dbunit.Run(t, "testdata/schema.sql", func(t *testing.T, db *sql.DB) {
    row := db.QueryRow("select email from users where id = 1")
    var email string
    if err := row.Scan(&email); err != nil {
        t.Fatal(err)
    }
    
    if email != "[email protected]" {
        t.Fatalf("user mismatch want %s,but get %s", "[email protected]", email)
    }
})

dbunit.Run 会自动创建数据库,并且自动导入testdata/fixtures目录下面的测试数据

2、多数据库创建

dbunit.New(t, func(d *DBUnit) {
    db := d.NewDatabase("testdata/schema.sql","testdata/fixtures/users.yml")
    // more database
    db2 = d.NewDatabase("testdata/schema2.sql")
    .....
})

从测试库导出测试数据文件

使用脚本导出数据

db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:3306)/%s", os.Getenv("DEV_DATABASE_USERNAME"), os.Getenv("DEV_DATABASE_PASSWORD"), os.Getenv("DEV_DATABASE_HOST"), "example")+"?charset=utf8&parseTime=True&loc=Asia%2FShanghai")
if err != nil {
    t.Fatal("db open error:", err)
}
// 导出前10个文档信息
data, err := dbunit.Dump(db, "testdata/fixtures/documents.yml", "select * from documents limit 10")
if err != nil {
    t.Fatal("dump documents error:", err)
}

// 从结果集中获取用户ID
userIds := dbunit.Pluck(data, "user_id")

//  导出所有相关的用户
_, err = dbunit.Dump(db, "testdata/fixtures/users.yml", "select * from users where id in(?)", userIds)
if err != nil {
    t.Fatal("dump users error:", err)
}

如果导出的数据已经在数据集文件中存在,则会忽略,判断依据为主键一致

导出测试集

你可以在参看 testdata/fixture.go 脚本编写测试集导出脚本

// 文章数据集
data, err := dbunit.Dump(db, "testdata/fixtures/articles.yml",
    "select * from articles where doc_id in(1,2)",
)
if err != nil {
    panic(err)
}

和其他ORM配合使用

dbunit.New(t, func(d *DBUnit) {
    db := d.NewDatabase("testdata/schema.sql","testdata/fixtures/users.yml")

    gormDB, err := gorm.Open(mysql.New(mysql.Config{Conn: db}))
})

关于fixture

当数据中需要动态数据,比如时间,可以参考如下做法,或者贡献你要的templateFunc

- id: 1
  created_at: {{now}}
  updated_at: {{now}}