回答

收藏

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

技术问答 技术问答 204 人阅读 | 0 人回复 | 2023-09-12

在 GoLang (testify) 中分离单元测试和集成测试是否有既定的最佳实践?我混合了单元测试(不依赖任何外部资源,所以运行速度非常快)和集成测试(依赖任何外部资源,所以运行速度很慢)。所以,当我说的时候go test.$ w, }  ]4 B/ ]/ R; \
最直接的技术似乎是 main 中定义一个 -integrate 标志:. }% f0 j8 ~' I4 n- s
    var runIntegrationTests = flag.Bool("integration",false    ,"Run the integration tests (in addition to the unit tests)")1 ]7 ^9 J0 E: a- B/ i& F, _4 w
然后在每个集成测试的顶部添加一个 if 语句:% N2 N1 k7 `1 R, y. J# a
    if !*runIntegrationTests    this.T().Skip("To run this test,use: go test -integration")}, D$ D+ Z7 c7 V
这是我能做的最好的吗?我搜索了 testify 文档,看看是否有命名协议或某些东西可以为我实现这一点,但没有找到任何东西。我错过了什么吗?
' ?  E0 A* W$ @# O8 D$ r; P& y                                                               
3 O6 k: u+ j1 ^  _6 `    解决方案:                                                               
6 E# U8 x# q5 U6 a1 ~' n' q                                                                编写一个integration_test.go,并给它一个集成的建筑标签。定义(全局)标志,如服务地址和连接字符串,并在您的测试中使用它们。
( R0 n6 r+ ^9 f0 ]0 \" W- B```golang$ N5 |6 ?$ \# a8 n3 I% F
//  build integration
" m! X  S- c% wvar fooAddr = flag.String(…)  A2 `. |3 V, T  d2 }
func TestToo(t testing.T) {3 d! H$ `+ O; ^! N) U$ V" S7 ~
                f,err := foo.Connect(fooAddr)
( L  }. C  y4 h+ ?, y! E: b                // …
2 t! L2 k  U. d}
0 R, {' @! }8 |* h2 X) s, W5 ?```- n4 B& t& y- X+ X
go test 像 go build 用同样的建筑标签,可以调用go test -tags=integration.  它还合成了调用 flag.Parse 的包 main,因此任何声明和可见的标志都将被处理并可用于您的测试。' e% I5 s- d/ V* l1 u
作为类似的选项,您还可以使用默认操作集成测试//  build !unit,然后通过操作go test -tags=unit.
: f" G4 h7 e0 ], \8 A3 F1 \  s@adamc 评论:
  J- t, t/ {' {对于任何尝试使用建筑标志的人来说,重要的是//  build test注释是文件中的第一行,注释后包含空行,否则应该-tags命令将忽略指令。8 x0 x2 p) m0 M
另外,建筑注释中使用的标记不得有折号,但允许使用下划线。例如,//  build unit-tests而///   build unit_tests会。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则