【问题标题】:Golang - Effective test of multiple packagesGolang - 多个包的有效测试
【发布时间】:2016-07-01 07:40:05
【问题描述】:

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

go test ./app/... 

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

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

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

你有什么更好的办法来有效地测试多个包吗?

【问题讨论】:

    标签: unit-testing go


    【解决方案1】:

    这就是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 test 和go test -short 运行这些测试。

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

    【讨论】:

      【解决方案2】:

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

      引用go help testflag:

      -运行正则表达式

      只运行那些匹配正则表达式的测试和示例。

      假设您有 3 个包:foobarqux。这些包的测试都分别命名为TestFoo..TestBar..TestQux..

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-28
        • 1970-01-01
        • 2019-03-17
        • 2015-03-28
        • 2020-04-06
        • 1970-01-01
        • 2016-01-05
        相关资源
        最近更新 更多