mysql - 如何测试使用数据库(mysql)的 Go 代码?

标签 mysql testing go

我有一个使用 MySQL 的 gRPC 服务,需要在每个测试用例后清除记录。我尝试用事务来包装每个测试用例。如果我的 rpc 代码中没有事务,它就可以工作,但如果有,它就会失败。并且会出现如下错误:

can't start transaction
...
sql: Transaction has already been committed or rolled back

然后我尝试使用 truncate 来清除记录,但一些测试用例随机失败。

我的代码是这样的(我使用 gorm):

func foo(db *gorm.DB) {
    tx := db.Begin()
    // query and insert
    tx.Commit()
}
// Use transaction to do database cleanup
func TestFooVersion1() {
    testDB := initDB()
    tx = testDB.Begin() // setup
    foo(testDB)
    tx.Rollback() // teardown
}
// Use truncate to do database cleanup
func TestFooVersion2() {
    testDB := initDB()
    foo(testDB)
    truncateTables(testDB) // teardown
}
func truncateTables(db *gorm.DB) {
    // exec "TRUNCATE TABLE table;" for every table
}

使用 DB(MySQL) 测试代码的正确方法是什么? (我不喜欢像 go-sqlmock 这样的 mock)

最佳答案

如果没有看到代码很难说,但根据错误,您似乎在多个测试之间共享一个连接,并且每个测试都在尝试启动一个事务。确保每个测试都打开自己的连接,启动自己的事务,并在完成后提交或回滚并关闭连接。

关于mysql - 如何测试使用数据库(mysql)的 Go 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45029545/

相关文章:

mysql - 使用逗号从另一个字段中选择 IN

javascript - 检查是否有效

c# - 以编程方式创建带有私钥的虚拟证书以进行测试

function - 通过对象而不是指向它的指针调用带有指针接收器的方法?

go - panic : template: redefinition of template

php - 我应该使用 PDO 在自己的数据库类中抛出异常吗?

PHP 并将 MySQL 行封装到 JSON 数组中

pointers - Go中如何使用map作为数据载体?

数据库 |将 CONCAT 函数格式化为带有小括号

.net - 我们可以在 QTP 9.2 中测试在 .Net 2.0 和 3.5 中开发的软件吗