是否同时进行单元测试?

时间:2014-06-23 23:06:56

标签: unit-testing go

运行go test时,它会运行以_test.go格式启动的函数并使用(* t testing.T)模块运行以TestXxx结尾的文件。我想知道_test.go文件中的每个函数是否同时运行,或者它是否分别运行每个函数?它是否为每一个创建了一个例程?如果它确实为每个人创建了一个例程,我可以用某种方式监控go例程吗?有可能做一些像golibrary.GoRoutines()这样的事情,并为每个人获取一个实例,并监控它们是如何或类似的东西?


注意:这个问题假设您使用go(测试)附带的测试框架。

4 个答案:

答案 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标志运行测试。

您可以看到other testing flags here

答案 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 ./...