一尘不染

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

go

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

策略一:

文件名: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"
)

有关示例,请参见字符串

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


阅读 305

收藏
2020-07-02

共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.go,这是myfunc在本例中。
  • 策略2: 文件myfunc_test.go使用package myfunc_test—在这种情况下,myfunc_test.go“中的测试代码将被编译为单独的程序包,然后与主测试二进制文件链接并运行”。[来源:test.go源代码中的58-59行]
  • 策略3: 文件myfunc_test.go使用package myfunc_testmyfunc使用点符号导入-这是策略2的变体,但使用点符号导入myfunc
2020-07-02