首页 > 后端开发 > Golang > 尽管使用了'-parallel 1”,为什么在 Go 中跨多个包运行时测试会失败?

尽管使用了'-parallel 1”,为什么在 Go 中跨多个包运行时测试会失败?

Mary-Kate Olsen
发布: 2024-11-04 05:53:29
原创
721 人浏览过

Why Do Tests Fail When Running Across Multiple Packages in Go Despite Using `-parallel 1`?

在 Go 中跨多个包运行测试时会出现并发问题

使用存储在 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(未记录):

  • 利用未记录的标志 go test -p 1,它会按顺序构建和测试所有包。

选项 2(基于 Shell):

  • 模拟 go test ./... 的功能,同时使用 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板