使用存储在 src/ 目录中的子目录下的多个包时,单独为每个包执行测试使用 go test 通常会成功。然而,当尝试使用 go test ./... 一起运行所有测试时,就会出现问题。
测试会执行,但由于测试之间的争用,最终在对本地数据库服务器进行操作时失败。尽管设置 -parallel 1 来防止数据库争用,测试仍然失败。这表明测试排序存在问题。
每个测试文件包含两个全局变量:
<code class="go">var session *mgo.Session var db *mgo.Database</code>
此外,它还使用以下设置和拆卸函数:
<code class="go">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() }</code>
每个测试都以setUp()开始并以tearDown()结束。 cfg 定义如下:
<code class="go">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") }</code>
修改 cfg 以使用随机数据库后,测试成功通过。此观察结果意味着来自多个包的测试在某种程度上是同时运行的。
可能的解决方案:
选项 1(未记录):
选项 2(基于 Shell):
Bash 命令:
<code class="bash">find . -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test</code>
函数别名(gotest):
<code class="bash">function gotest(){ find -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test; }</code>
通过调用 gotest .,可以顺序运行当前目录中的所有测试。
以上是尽管使用了“-parallel 1”,为什么在 Go 中跨多个包运行时测试会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!