【发布时间】:2014-07-06 02:07:28
【问题描述】:
我在 src/ 下的子目录下有多个包,
使用go test 为每个包运行测试工作正常。
当尝试使用go test ./... 运行所有测试时,测试正在运行但它失败了..
测试针对本地数据库服务器运行,每个测试文件都有带有 db 指针的全局变量。
我尝试使用-parallel 1 运行测试以防止数据库中的争用,但测试仍然失败。
这可能是什么问题?
编辑:某些测试因缺少数据库条目而失败,我在每次测试之前和之后完全清除了数据库。我能想到为什么会发生这种情况的唯一原因是因为测试之间存在一些争用。
编辑 2:
我的每个测试文件都有 2 个全局变量(使用 mgo):
var session *mgo.Session
var db *mgo.Database
它还具有以下设置和拆卸功能:
func setUp() {
s, err := cfg.GetDBSession()
if err != nil {
panic(err)
}
session = s
db = cfg.GetDB(session)
db.DropDatabase()
}
func tearDown() {
db.DropDatabase()
session.Close()
}
每个测试都使用setUp() 和defer tearDown() 启动
cfg 也是:
package cfg
import (
"labix.org/v2/mgo"
)
func GetDBSession() (*mgo.Session, error) {
session, err := mgo.Dial("localhost")
return session, err
}
func GetDB(session *mgo.Session) *mgo.Database {
return session.DB("test_db")
}
编辑 3:
我将 cfg 更改为使用随机数据库,测试通过了。 似乎来自多个包的测试在某种程度上是并行运行的。
是否可以强制 go test 跨包按顺序运行所有内容?
【问题讨论】:
-
错误信息是什么?你使用任何文件吗?当
go test从不同的目录启动时,相对路径可能会出错。 -
究竟是什么失败了?您提供的信息越多,我们能为您提供的帮助就越多。
-
要明确:上述问题的答案是
go test ./...。我每天都这样做。您还有其他一些与您的具体情况相关的问题,您需要更清楚地提出该问题。 -
一些测试似乎因为缺少数据库条目而失败,我在每次测试之前和之后完全删除了数据库,所以我能想到的唯一原因是在运行
go test ./...时会发生这种情况并且一切都通过了运行单个测试文件时是因为测试之间存在争用... -
“每次测试之前和之后”是什么意思?你是如何实施的?一个简化的测试示例在这里会大有帮助。
标签: unit-testing go mgo