运行go test
时,它会运行以_test.go
格式启动的函数并使用(* t testing.T)模块运行以TestXxx
结尾的文件。我想知道_test.go
文件中的每个函数是否同时运行,或者它是否分别运行每个函数?它是否为每一个创建了一个例程?如果它确实为每个人创建了一个例程,我可以用某种方式监控go例程吗?有可能做一些像golibrary.GoRoutines()
这样的事情,并为每个人获取一个实例,并监控它们是如何或类似的东西?
注意:这个问题假设您使用go(测试)附带的测试框架。
答案 0 :(得分:6)
是,tests are executed as goroutines因此执行并发。
但是,正如@jacobsa所指出的那样,测试默认不会并行运行。要启用并行执行,您必须在测试用例中调用t.Parallel()
并正确设置GOMAXPROCS
或提供-parallel N
。
在并行运行测试时,最简单的解决方案是获得端口号的全局切片和全局原子递增的索引,该索引用作切片中测试和端口之间的关联。这样您就可以控制端口号并为每个测试设置一个端口。例如:
import "sync/atomic"
var ports [...]uint64 = {10, 5, 55}
var portIndex uint32
func nextPort() uint32 {
return atomic.AddUint32(&portIndex, 1)
}
答案 1 :(得分:3)
您可以通过使用t.Parallel标记测试来同时运行它们
然后使用-parallel
标志运行测试。
答案 2 :(得分:2)
是的,如果添加此内容: t.Parallel()连接到您的函数。
像这样:
func TestMyFunction(t *testing.T) {
t.Parallel()
//your test code here
}
答案 3 :(得分:0)
是的,正如其他答案已经指出的那样,仅当您添加t.Parallel()
并使用-parallel
标签运行时,一个_test.go文件中的测试才并行运行。
但是-默认情况下,命令go test
在不同包的并行测试中运行,并且默认情况下是可用的CPU数量(请参见go help build
)
因此,要禁用并行执行,您应该运行这样的测试
go test -p 1 ./...