我有一个使用MySQL的gRPC服务,需要在每个测试用例后清除记录。我尝试用事务来包装每个测试用例。如果我的rpc代码中没有事务,但是如果没有事务,它就会起作用。而且还会有类似的错误:如何测试使用数据库(mysql)的Go代码?
can't start transaction
...
sql: Transaction has already been committed or rolled back
然后我尝试使用截断清除记录,但一些测试用例失败随机。
我的代码是这样(我用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模拟)
我添加了一些示例代码。问题是如果我在测试代码中使用事务(如'foo'函数),事务不起作用。 –