首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试使用数据库的Go代码(Mysql)?

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

Stack Overflow用户
提问于 2017-07-11 16:42:13
回答 2查看 447关注 0票数 0

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

代码语言:javascript
复制
can't start transaction
...
sql: Transaction has already been committed or rolled back

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

我的代码类似于(我使用gorm):

代码语言:javascript
复制
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 )

EN

回答 2

Stack Overflow用户

发布于 2017-07-11 21:28:00

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

票数 0
EN

Stack Overflow用户

发布于 2017-07-12 14:25:36

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

你可以使用来自证言的测试套件。每次测试时,请运行docker容器,并使用活动的mysql对其进行测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45029545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档