在 Go 中分离单元测试和集成测试

新手上路,请多包涵

在 GoLang 中分离单元测试和集成测试是否有既定的最佳实践(作证)?我混合使用单元测试(不依赖任何外部资源,因此运行速度非常快)和集成测试(依赖任何外部资源,因此运行速度较慢)。因此,我希望能够在我说 go test 时控制是否包含集成测试。

最直接的技术似乎是在 main 中定义一个 -integrate 标志:

 var runIntegrationTests = flag.Bool("integration", false
    , "Run the integration tests (in addition to the unit tests)")

然后在每个集成测试的顶部添加一个 if 语句:

 if !*runIntegrationTests {
    this.T().Skip("To run this test, use: go test -integration")
}

这是我能做的最好的吗?我搜索了 testify 文档,看看是否有命名约定或可以为我完成此操作的东西,但没有找到任何东西。我错过了什么吗?

原文由 Craig Jones 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 891
1 个回答

@Ainar-G 提出了几个很好的模式来分离测试。

SoundCloud 的这组 Go 实践 建议使用构建标签( 在构建包的“构建约束”部分中描述)来选择要运行的测试:

写一个 integration_test.go,给它一个 integration 的构建标签。为服务地址和连接字符串等定义(全局)标志,并在测试中使用它们。

 // +build integration

var fooAddr = flag.String(...)

func TestToo(t *testing.T) {
    f, err := foo.Connect(*fooAddr)
    // ...
}

go test 像 go build 一样获取构建标签,所以你可以调用 go test -tags=integration 。它还合成了一个调用 flag.Parse 的包 main,因此任何声明的和可见的标志都将被处理并可用于您的测试。

作为类似的选项,您还可以通过使用构建条件 // +build !unit 默认运行集成测试,然后通过运行 go test -tags=unit 根据需要禁用它们。

@adamc 评论:

对于任何其他尝试使用构建标签的人,重要的是 // +build test 注释是文件中的第一行,并且在注释后包含一个空行,否则 -tags 命令将忽略该指令。

此外,尽管允许使用下划线,但构建注释中使用的标签不能有破折号。例如, // +build unit-tests 将不起作用,而 // +build unit_tests 将起作用。

原文由 Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题