go test 是否同时运行单元测试?

新手上路,请多包涵

go test 运行时,它运行以 _test.go 结尾的文件,方法是运行以 TestXxx *t- 格式开头的函数–测试并使用 () 模块.我想知道 _test.go 文件中的每个函数是否同时运行,或者是否明确地分别运行每个函数?它是否为每个人创建一个 go routine?如果它确实为每个人创建了一个 go 例程,我可以以某种方式监视 go 例程吗?是否有可能做类似 golibrary.GoRoutines() 的事情并为每个实例获取一个实例并以某种方式或类似方式监视它们?


注意:本题假设你使用go自带的测试框架(testing)。

原文由 Charlie Parker 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

的, 测试作为 goroutines 执行,因此 并发 执行。

但是,正如 @jacobsa 指出的那样 ,默认情况下测试不会并行运行。 To enable parallel execution you would have to call t.Parallel() in your test case and set GOMAXPROCS appropriately or supply -parallel N (which is set to GOMAXPROCS 默认情况下)。

对于并行运行测试的情况,最简单的解决方案是拥有一个用于端口号的全局切片和一个全局原子递增索引,该索引用作切片中测试和端口之间的关联。这样您就可以控制端口号并为每个测试分配一个端口。例子:

 import "sync/atomic"

var ports [...]uint64 = {10, 5, 55}
var portIndex uint32

func nextPort() uint32 {
    return atomic.AddUint32(&portIndex, 1)
}

原文由 nemo 发布,翻译遵循 CC BY-SA 4.0 许可协议

是的,正如其他答案已经指出的那样,只有当您添加 t.Parallel() 并使用 -parallel 标签运行时,一个 _test.go 文件中的测试才会并行运行。

但是 - 默认情况下命令 go test 在不同包的并行测试中运行,默认是可用的 CPU 数量(参见 go help build

所以要禁用并行执行,你应该像这样运行测试 go test -p 1 ./...

原文由 Dmitry Davydov 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题