测试数据库交互

时间:2019-08-21 10:17:40

标签: database go testing

我有一个具有存储层的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中的数据库交互,那将非常有帮助。

1 个答案:

答案 0 :(得分:0)

我在集成测试方面经验不足,我不确定模拟数据库驱动程序是否可以为您工作,但是如果可以,我一直在使用go-sqlmock软件包来模拟sql数据库结果在单元测试中,就像魅力一样。您可以使用它,并且每个测试实际上都有一个单独的“数据库引擎”。因为您必须手动告诉模拟程序要期待什么查询和返回什么,但请相信我,这是很耗时的。

正如我之前所说,我不确定使用这种策略是否适合您的情况,因为如果您有兴趣了解应用程序在“真实数据库方案”中的行为,例如验证注册表是否已保存,然后进行模拟数据库结果是没有用的。