在 Go 中运行多个包测试
当使用 go test ./... 在子目录下的多个包中运行测试时,用户可以如果测试依赖全局变量和数据库交互,则会遇到问题。这是因为测试是并发执行的,可能会导致冲突和失败。
问题原因
问题的主要原因是不同包中的测试即使指定了 -parallel 1,也可以并行运行。这会导致潜在的共享资源争用,例如全局变量和数据库连接。
解决方案
使用 go test -p 1(未记录的标志)
正如 @Gal Ben-Haim 所建议的,未记录的标志 go test -p 1 可用于强制所有包按顺序构建和测试。这可确保测试按顺序执行,从而防止任何冲突。
自定义 Shell 脚本或别名
如果不首选使用未记录的标志,则可以使用自定义 shell 脚本或别名可以创建别名来模拟 go test ./... 的行为,同时强制顺序执行。例如:
<code class="bash">find . -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test</code>
设置和拆卸函数示例
以下是如何使用设置和拆卸函数来处理数据库设置和清理的示例:
<code class="go">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() }</code>
结论
为了确保顺序执行多个包的测试,用户可以使用未记录的标志 go test -p 1 或创建自定义 shell 脚本或别名按顺序运行测试。通过实施这种方法,可以避免并行执行引起的冲突和失败。
以上是如何在 Go 中顺序运行多个包测试?的详细内容。更多信息请关注PHP中文网其他相关文章!