回答

收藏

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

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

在 GoLang (testify) 中分离单元测试和集成测试是否有既定的最佳实践?我混合了单元测试(不依赖任何外部资源,所以运行速度非常快)和集成测试(依赖任何外部资源,所以运行速度很慢)。所以,当我说的时候go test.7 K0 u/ A! K1 w( @/ S/ z0 Q
最直接的技术似乎是 main 中定义一个 -integrate 标志:( m+ T2 ?! b+ z6 ^( g$ U9 n) V
    var runIntegrationTests = flag.Bool("integration",false    ,"Run the integration tests (in addition to the unit tests)")
    & L, e4 U2 q$ V5 k: T0 R4 B/ z
然后在每个集成测试的顶部添加一个 if 语句:
2 W; i! ], A% R$ ]
    if !*runIntegrationTests    this.T().Skip("To run this test,use: go test -integration")}) t8 ]4 r3 ^7 F% W1 m6 o% X" Z
这是我能做的最好的吗?我搜索了 testify 文档,看看是否有命名协议或某些东西可以为我实现这一点,但没有找到任何东西。我错过了什么吗?9 M0 H! M6 }3 ]* T  W5 |
                                                                / S' @$ U: ?% J9 _
    解决方案:                                                                % V6 d7 W2 e5 t
                                                                编写一个integration_test.go,并给它一个集成的建筑标签。定义(全局)标志,如服务地址和连接字符串,并在您的测试中使用它们。3 U. P; Q) F2 k0 H3 v6 K
```golang
+ e# k3 T1 V: D: @) G6 |//  build integration
3 i( E; `+ Q. E( q7 [var fooAddr = flag.String(…)
. O* [: r( E4 H! y/ n$ c: [func TestToo(t testing.T) {: j8 v  u1 l& ^+ A. M  }) z6 n
                f,err := foo.Connect(fooAddr)" W2 N- m; o/ j. i) ~6 j
                // …
( H6 R/ O, M& d1 p& H- s2 R}8 K+ j9 \+ I; y+ d  K3 Q/ G6 v  x1 e& A$ b
```& P; W6 Q+ |7 z1 J$ X
go test 像 go build 用同样的建筑标签,可以调用go test -tags=integration.  它还合成了调用 flag.Parse 的包 main,因此任何声明和可见的标志都将被处理并可用于您的测试。6 j' w9 }: c# t' u) g
作为类似的选项,您还可以使用默认操作集成测试//  build !unit,然后通过操作go test -tags=unit./ ]! Z2 ^( T. u2 Y' s* b
@adamc 评论:
/ Q; ?& U, }1 a% R4 U# a& j对于任何尝试使用建筑标志的人来说,重要的是//  build test注释是文件中的第一行,注释后包含空行,否则应该-tags命令将忽略指令。8 u" Y' l- f' @6 A, v9 S  y
另外,建筑注释中使用的标记不得有折号,但允许使用下划线。例如,//  build unit-tests而///   build unit_tests会。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则