一尘不染

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

go

我在 Go 中看到了几种不同的测试包命名策略,想知道每种策略的优缺点以及我应该使用哪一种。

策略一:

文件名:github.com/user/myfunc.go

package myfunc

测试文件名:github.com/user/myfunc_test.go

package myfunc

有关示例,请参见bzip2

策略二:

文件名:github.com/user/myfunc.go

package myfunc

测试文件名:github.com/user/myfunc_test.go

package myfunc_test

import (
    "github.com/user/myfunc"
)

策略三:

文件名:github.com/user/myfunc.go

package myfunc

测试文件名:github.com/user/myfunc_test.go

package myfunc_test

import (
    . "myfunc"
)

有关示例,请参见字符串

Go 标准库似乎混合使用了策略 1 和 2。我应该使用这三种中的哪一种?附加package *_test到我的测试包上很痛苦,因为这意味着我无法测试我的包私有方法,但也许有一个我不知道的隐藏优势?


阅读 218

收藏
2021-11-21

共1个答案

一尘不染

您列出的三种策略之间的根本区别在于测试代码是否与被测代码在同一个包中。在使用的决定package myfuncpackage myfunc_test在测试文件取决于你是否要执行白盒黑盒测试。

在项目中同时使用这两种方法并没有错。例如,您可以拥有myfunc_whitebox_test.gomyfunx_blackbox_test.go

测试代码包比较

  • 黑盒测试:使用package myfunc_test,这将确保您只使用导出的标识符
  • 白盒测试:使用package myfunc以便您可以访问非导出的标识符。适用于需要访问非导出变量、函数和方法的单元测试。

问题中列出的策略的比较

  • 策略 1:文件myfunc_test.go使用package myfunc- 在这种情况下, 中的测试代码myfunc_test.go将与 中正在测试的代码位于同一包中myfunc.gomyfunc在本示例中。
  • 策略 2:文件myfunc_test.go使用package myfunc_test——在这种情况下,myfunc_test.go“将作为单独的包编译,然后与主测试二进制文件链接并运行”中的测试代码。[来源:test.go源代码中的第 58-59 行]
  • 策略 3:文件myfunc_test.go使用package myfunc_testmyfunc使用点表示法导入- 这是策略 2 的变体,但使用点表示法导入myfunc.
2021-11-21