Golang在子目录中测试

The*_*uin 99 build go

我想在Go中使用测试和包的示例创建一个包作为子目录,以保持工作区更清洁.这有可能吗?如果可以的话怎么样?

所有文档总是将测试代码放在与其他代码相同的位置,这在某种程度上是更好还是只是常规?

Von*_*onC 165

请注意,您可以go test "递归" 运行:您需要列出要测试的所有软件包.

如果您是Go项目的根文件夹,请键入:

go test ./...
Run Code Online (Sandbox Code Playgroud)

在" ./..."符号的部分中描述的" 包列表的描述的"的" 命令go ":

导入路径是一种模式,如果它包含一个或多个" ..."通配符,每个通配符可以匹配任何字符串,包括空字符串和包含斜杠的字符串.

这样的模式扩展到GOPATH树中找到的所有包目录,其名称与模式匹配.

作为特例,x/...匹配x以及x子目录.
例如,在其子目录中net/...展开net并打包.


如果您将_test.go文件保存在子文件夹中,' go test ./...'命令将能够获取它们.
但:

  • 您需要为导出的变量和函数(在测试中使用)添加前缀,并使用包的名称,以便测试文件能够访问包导出的内容.
  • 您不会访问未导出的内容.

话虽这么说,我仍然希望将_test.go文件保留在主源文件旁边:它更容易找到.

  • 有些人可能认为不能访问私有内容是正常的黑盒测试,而且更好.关于必须限定公共符号,您始终可以导入_"...". (3认同)
  • 我发现,如果 (a) 您在单独的文件夹中有测试,并且 (b) 您想要测量代码覆盖率,则“go test ./...”效果不佳。由于某种原因,代码覆盖率遗漏了被测包 (2认同)

avi*_*rat 20

已编辑

基于 VonC 的回答,

这个答案在go1.11. 尚未在高go版本中测试。

对于那些喜欢将测试保存在子文件夹中的人,比如说test,然后运行

go test ./...
Run Code Online (Sandbox Code Playgroud)

将尝试在每个文件夹中运行测试,即使是那些不包含任何测试的文件夹,因此?在非测试文件夹的后续报告中会有一个。

跑步

go test ./.../test
Run Code Online (Sandbox Code Playgroud)

相反,它将仅针对您的test文件夹,因此只有专注于您的测试文件夹的干净报告。

警告

请注意,使用测试子文件夹将阻止覆盖率报告计算。go 的理念是将测试文件留在包文件夹中。

  • `go test ./.../test` 返回 `go: warning: "./.../test" matches no packages` // 不仅仅针对测试文件夹。go版本go1.13 darwin/amd64 (3认同)
  • 很好的提示,除了我五年前的答案。点赞 (2认同)
  • @Madeo,这是有道理的,因为 golang 不鼓励测试和代码的分离。异常情况是在以前的版本中允许它。 (2认同)
  • @avi.elkharrat,事实上,我决定不再采用这种方法,尽管我喜欢将测试保存在单独的包/文件夹中 =( (2认同)

Mat*_*att 12

将测试与代码放在一个文件中的同一目录中file_test.go,其中"file"是您正在测试的源代码文件的名称.这是惯例,我发现它最适合我自己的经验.

如果该go test工具不够自动化,您可以查看GoConvey,它有一个Web UI,它将自动更新并运行传统的Go测试以及GoConvey测试(基于行为,并且更自我记录)比传统的Go测试).

  • GoConvey非常棒(我正在等待新的用户界面,并且期待很高).我在我当前的项目中使用它,例如https://github.com/VonC/asciidocgo/blob/master/abstractNode_test.go).但是,`go test`也适用于子文件夹.见[我的答案如下](http://stackoverflow.com/a/21725603/6309) (2认同)