子目录中的Golang测试

mhd8tkvw  于 2023-03-16  发布在  Go
关注(0)|答案(4)|浏览(190)

我想在Go语言中创建一个测试包和示例包,并将它们作为子目录,以保持工作区的整洁。这是可能的吗?如果可以,怎么做?
所有的文档总是把测试代码和其他代码放在同一个地方,这在某种程度上是更好还是只是惯例?

t2a7ltrp

t2a7ltrp1#

请注意,您 * 可以 *“递归地”运行go test:你需要列出你要测试的所有软件包
如果您位于Go项目的根文件夹中,请键入:

go test ./...

' ./... '符号在“command go“的“程序包列表说明”一节中进行了说明:
如果导入路径包含一个或多个“...“通配符,并且每个通配符都可以匹配任何字符串(包括空字符串和包含斜线的字符串),则导入路径是一个模式。
这种模式扩展到GOPATH树中名称与模式匹配的所有包目录。
作为特殊情况,x/...匹配x以及x的子目录。
例如,net/...扩展为net,并在其子目录中进行包。
如果您将_test.go文件保存在子文件夹中,“go test ./...”命令将能够拾取它们。
但是:

  • 你需要在你的导出变量和函数(在你的测试中使用)前面加上你的包的名字,以便测试文件能够访问包导出的内容。
  • 你就无法访问非导出内容。

话虽如此,我还是希望把_test.go文件放在主源文件旁边:就更容易找到。
对于代码覆盖率:

go test -coverpkg=./... ./...

参见Frédéric G. MARANDfgmarand/gocoverstats中的“How to plot Go test coverage over time“,为Go项目的CI集成生成聚合覆盖率统计数据。
而且go-cover-treemap.io也很有趣。
kbolino在注解中所述:
您可以将测试放在单独的包中,而不必将它们放在单独的目录中。
软件包foo的测试文件可以在软件包foo_test中,并且仍然在相同的目录中,同时 * 不 * 具有对软件包foo的未导出(私有)成员的任何访问权限。

3okqufwl

3okqufwl2#

已编辑

基于VonC的回答
此答案在go1.11中有效。尚未在更高的go版本中测试。
对于那些喜欢将测试保存在子文件夹中的人,比如test,然后运行

go test ./...

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

go test ./.../test

相反,将只针对您的test文件夹,因此有一个干净的报告只集中在您的测试文件夹。

注意事项

请注意,使用测试子文件夹会妨碍覆盖率报告的计算。go的哲学是将测试文件留在包文件夹中。

ttygqcqt

ttygqcqt3#

把你的测试和你的代码放在同一个目录下的一个叫做file_test.go的文件中,“file”是你正在测试的源代码文件的名字,这是惯例,我发现这是我个人经验中最好的。
如果go test工具的自动化程度还不够高,可以考虑一下**GoConvey**,它有一个Web用户界面,可以自动更新并运行传统的Go测试和GoConvey测试(GoConvey测试基于行为,比传统的Go测试更具自文档化功能)。

ldioqlga

ldioqlga4#

我通常不做测试,但您可以将文件分组到目录中,并使用导入,如
import "./models"如果是一级输出
import "../models if是一个输出电平和一个输入电平
例如,对于:
./models/todo.go
./test/todo_test.go
要从todo_test.go测试todo.go,您在todo_test.go中的导入将是
import "../models"

相关问题