【发布时间】:2017-12-15 05:18:07
【问题描述】:
我有一个使用 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)
【问题讨论】: