使用Go语言进行适当的软件包命名testing
我在Go中看到了几个不同的testing包命名策略,想知道每个策略的优缺点,以及我应该使用哪一个。
策略1:
文件名:github.com/user/myfunc.go
package myfunc
testing文件名称:github.com/user/myfunc_test.go
package myfunc
参见bzip2的例子。
策略2:
文件名:github.com/user/myfunc.go
package myfunc
testing文件名称:github.com/user/myfunc_test.go
package myfunc_test import ( "github.com/user/myfunc" )
看到一个例子的电线 。
策略3:
文件名:github.com/user/myfunc.go
package myfunc
testing文件名称:github.com/user/myfunc_test.go
package myfunc_test import ( . "myfunc" )
看一个例子的string 。
Go标准库似乎使用了策略1和2的混合。我应该使用哪三个? 这是一个痛苦追加package *_test
到我的testing包,因为这意味着我不能testing我的包私有方法,但也许有隐藏的优势,我不知道?
您列出的三种策略之间的根本区别在于testing代码是否与被测代码位于同一个包中。 在testing文件中使用package myfunc
或package myfunc_test
的决定取决于您是要执行白盒还是黑盒testing。
在项目中使用这两种方法没有任何问题。 例如,你可以有myfunc_whitebox_test.go
和myfunx_blackbox_test.go
。
testing代码包比较
- 黑盒testing:使用
package myfunc_test
,这将确保您只使用导出的标识符 。 - 白盒testing:使用
package myfunc
以便您可以访问未导出的标识符。 适用于需要访问非导出variables,函数和方法的unit testing。
问题列表策略比较
- 策略1:文件
myfunc_test.go
使用package myfunc
– 在这种情况下,myfunc_test.go
的testing代码将与myfunc.go
(本例中为myfunc
中正在testing的代码位于同一包中。 - 策略2:文件
myfunc_test.go
使用package myfunc_test
– 在这种情况下,myfunc_test.go
的testing代码将被编译为一个单独的包,然后与主testing二进制文件链接并运行。 [源代码: test.go源代码中的第58-59行] - 策略3:文件
myfunc_test.go
使用package myfunc_test
,但使用点符号导入myfunc
– 这是策略2的变体,但使用点符号来导入myfunc
。
您应尽可能使用策略1。 您可以使用特殊的foo_test
包名称来避免导入循环,但主要是这样,所以标准库可以使用相同的机制进行testing。 例如, strings
不能用策略1进行testing,因为testing
包依赖于strings
。 正如你所说的,在策略2或策略3中,你不能访问包的私有标识符,所以通常最好不要使用它,除非必须。
这取决于你的testing范围。 高级testing(集成,验收等)应该放在一个单独的包中,以确保您通过导出的API使用包。
如果你有一个包含很多内部需要被testing的大包,那么使用相同的包进行testing。 但是这不是您的testing访问任何私人状态的邀请。 那会让重构变成一场噩梦。 当我写结构时,我经常实现接口。 这是我从我的testing中调用的那些接口方法,而不是所有的帮助方法/函数。