我为一个web实现了几个包,每个包都有自己的测试用例。当使用go test ./api/pkgname
测试每个包时,测试就会通过。如果我想使用go test ./api/...
同时运行所有测试,那么测试用例总是失败的。
在每个测试用例中,我使用DROP SCHEMA public CASCADE
和CREATE SCHEMA public
重新创建整个模式,并应用所有迁移。测试套件随机地报告错误,表示不存在关系/表,因此我猜每个测试套件(每个包)都会以某种方式并行运行,从而扰乱DB状态。
我试图传递一些测试标志,如go test -cpu 1 -parallel 0 ./src/api/...
,但没有成功。
这里的问题是否是并行运行的测试,如果是,我如何强制串行执行?
更新:
目前,我使用这个解决方案来运行测试,但我仍然想知道是否有更好的解决方案
find <dir> -type d -exec go test {} \;
发布于 2013-10-03 18:40:57
正如其他人所指出的,-parallel不做这项工作(它只在包中工作)。但是,您可以使用标志-p=1以串联方式运行包测试。这里记录了这一点:
http://golang.org/src/cmd/go/testflag.go
但是(afaict)没有在命令行,去帮助等。我不确定它是否意味着停留(虽然我认为如果它被删除,-parallel应该被修复)。
发布于 2013-03-31 20:22:24
提供go工具是为了使用*_test.go文件中包含单元测试的约定,使运行中的单元测试更容易。因为它假设它们是单位测试,所以它也假设它们是密封的。听起来你的测试不是单元测试,也不是单元测试,而是违反了单元测试应该实现的假设。
如果您的意思是这些测试是单元测试,那么您可能需要一个模拟数据库来进行单元测试。内存中最好是模拟数据库,以确保单元测试是封闭的,不会受到其他单元测试的干扰。
如果您想让这些测试成为集成测试,那么最好不要在这些测试中使用go工具。您可能想要的是创建一个独立的测试二进制文件,您可以在其中控制和编写集成测试脚本。
好消息是,在Go中创建一个模拟非常容易。将代码更改为与数据库所关心的方法相结合的接口,然后为测试目的编写该接口的内存实现,并将其传递到要测试的应用程序代码中。
发布于 2013-10-02 10:05:57
为了澄清一下,杰里米的回答仍然是被接受的:
由于我的集成测试只在一个包(api
)上运行,所以我最终删除了单独的测试二进制文件,并通过以下方法创建了一个模式来分离测试类型:
TestX
名称。Test_X
我创建了shell脚本(utest.sh
/itest.sh
)来运行这两种脚本。
go test -run="^(Test|Benchmark)[^_](.*)"
go test -run"^(Test|Benchmark)_(.*)"
go test
运行这两种https://stackoverflow.com/questions/15721238
复制相似问题