使用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 myfuncpackage myfunc_test的决定取决于您是要执行白盒还是黑盒testing。

在项目中使用这两种方法没有任何问题。 例如,你可以有myfunc_whitebox_test.gomyfunx_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中调用的那些接口方法,而不是所有的帮助方法/函数。