回答

收藏

使用 Go 语言进行测试的正确包命名

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

我在 Go 我看到了几种不同的测试包命名策略,想知道每种策略的优缺点以及我应该使用哪一种。+ ?. M7 W5 G: q2 F7 W. K
策略一:
6 O( y. L# z$ K( g: l' \' w文件名:github.com/user/myfunc.go
' |5 ]1 l! J9 j) Q% I
    package myfunc  K2 k+ e! p2 n! A, g" k8 n
测试文件名称:github.com/user/myfunc_test.go0 p- h- `' G; k/ K+ A' P+ [8 e2 O
    package myfunc$ ^# ^) X: H; X. n- L- ?
有关示例,请参见bzip2。, f$ X8 j# C/ s( R' h2 r. o+ d- J3 B
策略二:
3 v# Y' ]  A0 x8 h$ I) g文件名:github.com/user/myfunc.go
( r7 _+ s% _% a& N: Q/ P7 ?: N
    package myfunc
    2 [, p0 b: I9 [$ H# [, o
测试文件名称:github.com/user/myfunc_test.go
6 p0 f9 f: _7 b/ m  w5 g) _  ?
    package myfunc_testimport  "github.com/user/myfunc")
    ( h# J& |2 h5 _+ k3 t: m. f
策略三:
, P0 ?6 M2 Z2 i7 h文件名:github.com/user/myfunc.go' [1 l$ ^2 ?  u* U* {5 H( n  F! E
    package myfunc
    2 ?; {  |! K) u% l! P5 }- J& `% D
测试文件名称:github.com/user/myfunc_test.go2 q9 x9 i$ }( W/ G
    package myfunc_testimport  . "myfunc")
    $ J4 |& W- S) z+ d: a+ \4 R$ c
请参见字符串。
9 l/ Z) b. H8 o1 e$ xGo 标准库似乎混合了 1 和 2的策略。这三个应该用哪一个?package *_test我的测试包很痛苦,因为这意味着我不能测试我的私人方法,但也许有一个我不知道的隐藏优势?: f( w2 C( ~  w8 i, T% U3 ~' ^- Q
                                                                9 m5 O+ M/ t' J+ C2 d
    解决方案:                                                               
" T* S1 s  K% x9 q) q% p0 h# t                                                                您列出的三种策略之间的根本区别在于测试代码是否与被测代码在同一个包中。使用决定package myfunc或package myfunc_test测试文件取决于您是否要执行白盒或黑盒测试。. z5 b/ e! D  S7 X
在项目中同时使用这两种方法没有错。例如,你可以拥有它myfunc_whitebox_test.go和myfunx_blackbox_test.go。  K7 ?/ Z) F7 U2 l& b& E
比较测试代码包黑盒测试:使用package myfunc_test,这将确保您只使用导出的标识符。
$ L; H: E9 U3 e# d: T白盒测试:使用package myfunc使您能够访问非导出标识符。适用于需要访问非导出变量、函数和方法的单元测试。
比较问题中列出的策略
' `/ E  i% {6 p2 v5 o- x* p) n策略 1:文件myfunc_test.go使用package myfunc- 在这种情况下,中间的测试代码myfunc_test.go与 中正在测试的代码在同一包中myfunc.go,myfunc在这个例子中。) O& v2 l6 X* s0 s# j
策略 2:文件myfunc_test.go使用package myfunc_test——在这种情况下,myfunc_test.go在主测试二进制文件链接并运行为单独的包编译,然后链接并运行主测试二进制文件[来源:test.go源代码中的第 58-59 行]
! ?. @* r* Z2 n5 R- m# i策略 3:文件myfunc_test.go使用package myfunc_test但myfunc导入使用点表示法- 这是策略 2 的变体,但导入使用点表示法myfunc.
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则