我想从我的应用程序执行所有测试,现在我用命令执行:
go test ./app/...
不幸的是,尽管单次测试运行得非常快,但需要相当长的时间。我认为问题是go
需要在运行测试之前编译每个包(具有依赖性)。
我尝试使用-i
标志,它有点帮助,但我仍然不满意测试时间。
go test -i ./app/...
go test ./app/...
您是否更了解如何有效地测试多个包。
答案 0 :(得分:2)
这是go test
的本质:它构建了一个特殊的运行时,其中包含要执行的附加代码(这就是它跟踪代码覆盖的方式)。
如果不够快,您有两种选择:
1)使用bash工具编译包列表(例如使用ls
),然后分别并行执行它们。在bash中有很多方法可以做到这一点。
这种方法的问题在于输出将是交错的,难以追踪故障。
2)在每个测试中使用t.Parallel()
标志,以允许测试运行时并行执行。从Go 1.5开始,go test
运行时GOMAXPROCS
设置为CPU上的核心数,允许同时运行测试。默认情况下,测试仍然是同步运行的。您必须为每个测试设置t.Parallel()
标志,告诉运行时可以并行执行此测试。
这种方法的问题在于它假定您遵循最佳实践并使用了SoC /解耦,没有全局状态会在另一个测试的中间发生变异,没有互斥锁(或者很少有锁),没有竞争条件问题(使用-race
)等。
-
意见:就个人而言,我设置IDE以在每次保存时运行gofmt
和go test -cover -short
。这样,我的代码总是被格式化,我的测试只在我所在的包中运行,告诉我是否有失败。 -cover
标志与我的IDE一起使用,向我展示已经过测试而未经过测试的代码行。 -short
标志允许我编写我知道需要一段时间才能运行的测试,在这些测试中我可以检查t.Short()
bool以查看我是否应t.Skip()
进行测试。应该有你最喜欢的IDE可用的软件包(我在Sublime,VIM和现在的Atom中做过)。
这样,我在编辑的包中有即时反馈。
在我提交代码之前,我会在所有包中运行所有测试。或者,我可以拥有C.I.服务器做到了。
或者,您可以使用-short
标记和build tags
(例如go test -tags integration
)来重构您的测试,以将您的单元测试与集成测试分开。这就是我编写测试的方式:
测试快速并且可以并行运行< - 我默认使用go test
和go test -short
运行这些测试。
需要外部组件的慢速测试或测试,我需要运行添加输入,运行它们需要go test -tags integration
。此模式不会使用普通go test
运行集成测试,您必须指定其他标记。我也没有全面运行集成测试。这就是我的CI服务器的用途。
答案 1 :(得分:0)
如果您为测试遵循一致的名称方案,则可以使用-run
标志轻松减少执行的数量。
引自go help testflag
:
-run regexp
仅运行与正则表达式匹配的测试和示例。
因此,我们假设您有3个套餐:foo
,bar
和qux
。这些包的测试分别命名为TestFoo..
,TestBar..
和TestQux..
。
您可以go test -run '^Test(Foo|Bar)*' ./...
仅运行foo
和bar
包中的测试。