我有一个具有存储层的API。它仅进行数据库交互并执行CRUD操作。现在我要测试这些功能。 在我的路径API / storage /中,我有不同的程序包,它们具有与同一数据库中的不同表进行交互的功能。表A,B和C在同一数据库中。
我的文件层次结构如下:
--api
--storage
--A
--A.go
--A_test.go
--B
--C
--server
--A
--testData
--A.sql
--B.sql
这样,我想使用命令
测试整个存储层go test ./...
我遵循的方法是,我有一个函数 RefreshTables ,该函数首先将表截断,然后用我保存在testData文件夹中的固定测试数据填充该表。对于截断,我可以这样做:
db.Exec("SET FOREIGN_KEY_CHECKS = 0;")
db.Exec("truncate " + table)
db.Exec("SET FOREIGN_KEY_CHECKS = 1;")
默认情况下,当go test并行运行不同程序包的测试功能时,将创建多个sql连接,并在其他连接上运行 truncate ,而在某些连接上运行 set外键连接池中随机连接其他连接。
如果一起运行,我将无法通过测试,但是如果单独运行或打包运行,则所有测试都将通过。
如果我这样做:
go test ./... -p 1
这使得测试功能一个接一个地运行,所有测试都通过了。
我还尝试过在截断之前使用事务来截断和锁定表。
我检查了这篇文章(https://medium.com/kongkow-it-medan/parallel-database-integration-test-on-go-application-8706b150ee2e),他建议在每个测试函数中创建不同的数据库,并在函数结束后删除该数据库。我认为这将花费很多时间。
如果有人建议使用最好的方法来测试Golang中的数据库交互,那将非常有帮助。
答案 0 :(得分:0)
我在集成测试方面经验不足,我不确定模拟数据库驱动程序是否可以为您工作,但是如果可以,我一直在使用go-sqlmock软件包来模拟sql数据库结果在单元测试中,就像魅力一样。您可以使用它,并且每个测试实际上都有一个单独的“数据库引擎”。因为您必须手动告诉模拟程序要期待什么查询和返回什么,但请相信我,这是很耗时的。
正如我之前所说,我不确定使用这种策略是否适合您的情况,因为如果您有兴趣了解应用程序在“真实数据库方案”中的行为,例如验证注册表是否已保存,然后进行模拟数据库结果是没有用的。