我有一個使用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'函數),事務不起作用。 –