An open API service indexing awesome lists of open source software.

https://github.com/goapt/dbunit

golang database unit testing package
https://github.com/goapt/dbunit

Last synced: about 2 months ago
JSON representation

golang database unit testing package

Awesome Lists containing this project

README

        

# 数据库单元测试辅助
Build Status
codecov
Go Report Card
<br />
GoDoc

## 使用

```shell script
go get github.com/goapt/dbunit
```

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

```go
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、多数据库创建

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

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

### 使用脚本导出数据
```go
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` 脚本编写测试集导出脚本

```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配合使用

```go
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
```yaml
- id: 1
created_at: {{now}}
updated_at: {{now}}
```