我在 Go 中看到了几种不同的测试包命名策略,想知道每种方法的优缺点以及我应该使用哪一种。
策略 1:
文件名:github.com/user/myfunc.go
package myfunc
测试文件名:github.com/user/myfunc_test.go
package myfunc
见 bzip2举个例子。
策略 2:
文件名:github.com/user/myfunc.go
package myfunc
测试文件名:github.com/user/myfunc_test.go
package myfunc_test
import (
"github.com/user/myfunc"
)
见 wire举个例子。
策略 3:
文件名:github.com/user/myfunc.go
package myfunc
测试文件名:github.com/user/myfunc_test.go
package myfunc_test
import (
. "myfunc"
)
见 strings举个例子。
Go 标准库似乎混合使用了策略 1 和 2。我应该使用这三个中的哪一个?将 package *_test
附加到我的测试包中很痛苦,因为这意味着我无法测试我的包私有(private)方法,但也许有一个我不知道的隐藏优势?
最佳答案
您列出的三种策略之间的根本区别在于测试代码是否与被测代码在同一个包中。在测试文件中使用 package myfunc
或 package myfunc_test
的决定取决于您是否要执行 white-box或 black-box测试。
在项目中同时使用这两种方法并没有错。例如,您可以有 myfunc_whitebox_test.go
和 myfunx_blackbox_test.go
。
测试代码包比较
- 黑盒测试:使用
package myfunc_test
,这将确保您只使用exported identifiers . - 白盒测试:使用
package myfunc
以便您可以访问未导出的标识符。适用于需要访问非导出变量、函数和方法的单元测试。
问题中列出的策略比较
- 策略 1:
myfunc_test.go
文件使用package myfunc
— 在这种情况下,myfunc_test.go< 中的测试代码
将与myfunc.go
中正在测试的代码在同一个包中,在本例中为myfunc
。 - 策略 2: 文件
myfunc_test.go
使用package myfunc_test
— 在本例中是myfunc_test.go< 中的测试代码
"将被编译为一个单独的包,然后与主测试二进制文件链接并运行。"[来源:test.go 中的第 58-59 行源代码] - 策略 3:
myfunc_test.go
文件使用package myfunc_test
但使用点符号导入myfunc
—这是策略 2 的变体,但使用点符号来导入myfunc
。
关于unit-testing - 使用 Go 语言进行测试的正确包命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19998250/