我有一个带有这个项目结构的GO项目(每个包中有多对这类文件)。
- api
- userHandler.go
- userHandler_test.go
- database
- user.go
- user_test.go
在user.go中我有User结构和创建/获取/更新用户的功能(我使用的是GORM,但这不是问题)。在user_test.go。
我想为每个不同的文件清理数据库(删除所有数据或处于某种状态),所以我尝试为每个文件创建1个套件(使用Testify),然后使用SetupSuite功能,但行为似乎不确定,可能我做错了。
所以我的问题是:
现在我也有一个奇怪的错误:正在运行
go test path/package1
go test path/package2
一切正常,但如果我跑(测试所有包)
cd path && go test ./...
我的错误似乎不是确定性的,这就是为什么我猜测数据库连接没有得到正确处理
答案 0 :(得分:1)
如果您的api
软件包依赖于您的database
软件包(它看起来如此),那么您的api
软件包应该有办法提供数据库连接池(例如{{1}对它来说。
在您对*sql.DB
包的测试中,您应该只传入一个可以使用的初始化池(可能已预先填充了测试架构/夹具)。这可以是api
init()
包中的全局初始化,也可以是每个测试函数中的api
和setup()
模式。
这是前(最简单)的方法,您只需为要使用的测试创建共享数据库和模式。
defer teardown()
一些提示:
package database
import testing
var testDB *sql.DB
// This gets run before your actual test functions do.
func init() {
var err error
db, err = sql.Open(...)
if err != nil {
log.Fatalf("test init failed: %s", err)
}
_, err := db.Exec(`CREATE TABLE ....`)
if err != nil {
log.Fatalf("test schema creation failed: %s", err)
}
}
函数创建一个带有随机后缀的表并插入您的测试数据,以便您的测试不使用相同的测试表(因此存在冲突或相互依赖的风险) 。捕获该表名并将其转储到setup()
函数中。