Golang - 多个包的有效测试

时间:2016-06-29 07:30:38

标签: unit-testing go

我想从我的应用程序执行所有测试,现在我用命令执行:

go test ./app/... 

不幸的是,尽管单次测试运行得非常快,但需要相当长的时间。我认为问题是go需要在运行测试之前编译每个包(具有依赖性)。

我尝试使用-i标志,它有点帮助,但我仍然不满意测试时间。

go test -i ./app/... 
go test ./app/... 

您是否更了解如何有效地测试多个包。

2 个答案:

答案 0 :(得分:2)

这是go test的本质:它构建了一个特殊的运行时,其中包含要执行的附加代码(这就是它跟踪代码覆盖的方式)。

如果不够快,您有两种选择:

1)使用bash工具编译包列表(例如使用ls),然后分别并行执行它们。在bash中有很多方法可以做到这一点。

这种方法的问题在于输出将是交错的,难以追踪故障。

2)在每个测试中使用t.Parallel()标志,以允许测试运行时并行执行。从Go 1.5开始,go test运行时GOMAXPROCS设置为CPU上的核心数,允许同时运行测试。默认情况下,测试仍然是同步运行的。您必须为每个测试设置t.Parallel()标志,告诉运行时可以并行执行此测试。

这种方法的问题在于它假定您遵循最佳实践并使用了SoC /解耦,没有全局状态会在另一个测试的中间发生变异,没有互斥锁(或者很少有锁),没有竞争条件问题(使用-race)等。

-

意见:就个人而言,我设置IDE以在每次保存时运行gofmtgo 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 testgo test -short运行这些测试。

  • 需要外部组件的慢速测试或测试,我需要运行添加输入,运行它们需要go test -tags integration。此模式不会使用普通go test运行集成测试,您必须指定其他标记。我也没有全面运行集成测试。这就是我的CI服务器的用途。

答案 1 :(得分:0)

如果您为测试遵循一致的名称方案,则可以使用-run标志轻松减少执行的数量。

引自go help testflag

  

-run regexp

     

仅运行与正则表达式匹配的测试和示例。

因此,我们假设您有3个套餐:foobarqux。这些包的测试分别命名为TestFoo..TestBar..TestQux..

您可以go test -run '^Test(Foo|Bar)*' ./...仅运行foobar包中的测试。