Go:使用DB初始化从多个包运行测试

时间:2015-06-25 22:11:12

标签: go go-gorm testify

我有一个带有这个项目结构的GO项目(每个包中有多对这类文件)。

- api
    - userHandler.go
    - userHandler_test.go
- database
    - user.go
    - user_test.go

在user.go中我有User结构和创建/获取/更新用户的功能(我使用的是GORM,但这不是问题)。在user_test.go。

我想为每个不同的文件清理数据库(删除所有数据或处于某种状态),所以我尝试为每个文件创建1个套件(使用Testify),然后使用SetupSuite功能,但行为似乎不确定,可能我做错了。

所以我的问题是:

  • 哪种方式可以共享数据库连接?使用全局变量是最佳选择吗?
  • 在每次运行file_test.go之前,在DB中创建表一次然后使用自定义数据初始化数据库的最佳方法是什么?

现在我也有一个奇怪的错误:正在运行

go test path/package1
go test path/package2

一切正常,但如果我跑(测试所有包)

cd path && go test ./...

我的错误似乎不是确定性的,这就是为什么我猜测数据库连接没有得到正确处理

1 个答案:

答案 0 :(得分:1)

如果您的api软件包依赖于您的database软件包(它看起来如此),那么您的api软件包应该有办法提供数据库连接池(例如{{1}对它来说。

在您对*sql.DB包的测试中,您应该只传入一个可以使用的初始化池(可能已预先填充了测试架构/夹具)。这可以是api init()包中的全局初始化,也可以是每个测试函数中的apisetup()模式。

这是前(最简单)的方法,您只需为要使用的测试创建共享数据库和模式。

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()函数中。
  • https://medium.com/@benbjohnson/structuring-applications-in-go-3b04be4ff091值得阅读以获得更多视角。