【问题标题】:Only running tests affected by recent changes仅运行受最近更改影响的测试
【发布时间】:2019-11-12 13:28:08
【问题描述】:

有没有办法只执行那些受 Go 最近变化影响的测试?我们有一个大型单元测试套件,现在它开始需要一段时间才能完成。我们认为我们只运行那些受第一轮代码更改影响的测试。

Python 有这样的东西:https://github.com/tarpas/pytest-testmon

有没有办法在 Go 中做到这一点?

【问题讨论】:

  • 仅缓存包测试:来自测试文档:go test caches successful package test results to avoid unnecessary repeated running of test

标签: unit-testing go


【解决方案1】:

不,在 Go 中没有办法做到这一点。您所能做的就是将您的代码拆分成包并一次测试一个包

go test some/thing

而不是全部

go test ./...

【讨论】:

    【解决方案2】:

    go test 在 Go 1.10 及更高版本中会在包级别自动执行此操作;任何没有变化的包都将返回缓存的测试结果,而有变化的包将被重新测试。

    如果单个包的测试仍然花费太长时间,则表明您的测试存在问题; Go 中的优秀测试通常执行得非常快,这意味着您可能需要自己审查测试,并结合以下几点:

    • 使用build tags 隔离集成测试。涉及外部资源的测试往往速度较慢,因此将它们设为可选将有助于加快您只需要单元测试结果的运行。
    • 使用short tests,这样您就可以选择更频繁地使用快速通道。
    • 查看您的单元测试 - 您是否有不必要的测试或测试用例?您的测试是否过于复杂?您是否正在阅读可以保存在常量中的黄金文件?当您可以通过编程方式创建对象时,您是否将静态 JSON 反序列化为对象?
    • 优化您的单元测试。测试仍然是代码,性能不佳的代码可以针对性能进行优化。在单元测试中有很多情况下,我们很乐意选择便利性而不是性能,而我们不会在生产代码中使用这种方式,但如果性能是一个问题,则必须重新考虑该选择。
    • 检查您的测试执行情况 - 您是否使用了 go test 的不可缓存参数来阻止它缓存结果?在不必要的情况下,您是否出于习惯使用竞争检测器、分析器或代码覆盖率报告?

    【讨论】:

      【解决方案3】:

      您不能仅对最后编辑的文件重新运行测试。但是有几种优化运行测试的方法。 首先,您必须将项目拆分为逻辑分隔的包。这将导致一种情况,即一项更改仅需要在包中重新运行测试(在大多数情况下)。 其次,您可以通过键入仅针对您正在更改的包运行测试

      go test mypkg
      

      或者...您可以使用build tags。最后一种优化方式是使用shorttest functionality

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-26
        • 1970-01-01
        • 2012-11-07
        • 2019-11-20
        • 2016-12-15
        • 2014-02-26
        • 2023-01-25
        • 1970-01-01
        相关资源
        最近更新 更多