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

时间:2017-07-11 08:42:13

标签: 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那样的模拟)

2 个答案:

答案 0 :(得分:0)

很难说没有看到代码,但根据错误,它听起来像是在多个测试之间共享连接,而每个测试都试图启动一个事务。确保每个测试打开自己的连接,启动自己的事务,完成后,提交或回滚并关闭连接。

答案 1 :(得分:0)

也许您可以使用docker进行集成测试。直接测试具有活动mysql的生成容器。

您可以使用testify中的测试套件。 每次测试时,运行docker容器,并使用实时mysql进行测试。

相关问题