为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕工程0101907 2021-08-16 19:32:31
在 GoLang (testify) 中分离单元测试和集成测试是否有既定的最佳实践?我混合了单元测试(不依赖任何外部资源,因此运行速度非常快)和集成测试(依赖任何外部资源,因此运行速度较慢)。所以,当我说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 文档,看看是否有命名约定或某些东西可以为我完成这个任务,但没有找到任何东西。我错过了什么吗?
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

提出了几种很好的模式来分离测试。


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


编写一个integration_test.go,并给它一个集成的构建标签。为诸如服务地址和连接字符串之类的内容定义(全局)标志,并在您的测试中使用它们。


// +build integration


var fooAddr = flag.String(...)


func TestToo(t *testing.T) {

    f, err := foo.Connect(*fooAddr)

    // ...

}

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


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


@adamc 评论:


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


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


查看完整回答
反对 回复 2021-08-16
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

我看到了三种可能的解决方案。第一种是使用短模式进行单元测试。因此,您将使用go test -short单元测试和相同的但没有-short标志来运行您的集成测试。标准库使用短模式跳过长时间运行的测试,或者通过提供更简单的数据使它们运行得更快。

第二是使用公约,并打电话给你测试,无论是TestUnitFooTestIntegrationFoo再使用-run测试标志来表示要运行的测试。因此,您将go test -run 'Unit'用于单元测试和go test -run 'Integration'集成测试。

第三个选项是使用环境变量,并在您的测试设置中使用os.Getenv. 然后您将使用 simplego test进行单元测试和FOO_TEST_INTEGRATION=true go test集成测试。

我个人更喜欢这个-short解决方案,因为它更简单并且在标准库中使用,所以它似乎是分离/简化长时间运行测试的事实上的方法。但是-runos.Getenv解决方案提供了更大的灵活性(也需要更加谨慎,因为正则表达式涉及-run)。


查看完整回答
反对 回复 2021-08-16
  • 3 回答
  • 0 关注
  • 239 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信