gpt4 book ai didi

database - 测试数据库交互

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:05 25 4
gpt4 key购买 nike

我有一个具有存储层的 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 foreign key 在某些连接上运行其他连接从连接池中随机抽取。

如果一起运行,我无法通过我的测试,但如果单独运行或打包运行,所有测试都会通过。

如果我这样做:

go test ./... -p 1

这使得测试函数一个一个运行,所有的测试都通过。

我还尝试过使用事务来截断并在截断之前锁定表。

我查看了这篇文章 ( https://medium.com/kongkow-it-medan/parallel-database-integration-test-on-go-application-8706b150ee2e ),他建议在每个测试函数中创建不同的数据库,并在函数结束后删除该数据库。我认为这将非常耗时。

如果有人建议在 Golang 中测试数据库交互的最佳方法,那将非常有帮助。

最佳答案

我在集成测试方面没有太多经验,我不确定模拟数据库驱动程序是否适合您,但如果可以,我一直在使用 go-sqlmock用于模拟 sql 数据库的包导致单元测试并且工作起来很有魅力。您可以使用它,并为您的每个测试提供一个单独的“数据库引擎”。这有点耗时,因为您必须手动告诉 mock 期望查询什么以及返回什么,但相信我,这是一个很好的投资时间。

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

关于database - 测试数据库交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57589400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com