我想在Go语言中创建一个测试包和示例包,并将它们作为子目录,以保持工作区的整洁。这是可能的吗?如果可以,怎么做?所有的文档总是把测试代码和其他代码放在同一个地方,这在某种程度上是更好还是只是惯例?
t2a7ltrp1#
请注意,您 * 可以 *“递归地”运行go test:你需要列出你要测试的所有软件包。如果您位于Go项目的根文件夹中,请键入:
go test
go test ./...
' ./... '符号在“command go“的“程序包列表说明”一节中进行了说明:如果导入路径包含一个或多个“...“通配符,并且每个通配符都可以匹配任何字符串(包括空字符串和包含斜线的字符串),则导入路径是一个模式。这种模式扩展到GOPATH树中名称与模式匹配的所有包目录。作为特殊情况,x/...匹配x以及x的子目录。例如,net/...扩展为net,并在其子目录中进行包。如果您将_test.go文件保存在子文件夹中,“go test ./...”命令将能够拾取它们。但是:
./...
go
...
GOPATH
x/...
x
net/...
net
_test.go
话虽如此,我还是希望把_test.go文件放在主源文件旁边:就更容易找到。对于代码覆盖率:
go test -coverpkg=./... ./...
参见Frédéric G. MARAND和fgmarand/gocoverstats中的“How to plot Go test coverage over time“,为Go项目的CI集成生成聚合覆盖率统计数据。而且go-cover-treemap.io也很有趣。如kbolino在注解中所述:您可以将测试放在单独的包中,而不必将它们放在单独的目录中。软件包foo的测试文件可以在软件包foo_test中,并且仍然在相同的目录中,同时 * 不 * 具有对软件包foo的未导出(私有)成员的任何访问权限。
fgmarand/gocoverstats
go-cover-treemap.io
foo_test
foo
3okqufwl2#
已编辑
基于VonC的回答此答案在go1.11中有效。尚未在更高的go版本中测试。对于那些喜欢将测试保存在子文件夹中的人,比如test,然后运行
go1.11
test
将尝试在 every 文件夹中运行测试,即使是那些不包含任何测试的文件夹,因此在非测试文件夹的后续报告中有?。跑步
?
go test ./.../test
相反,将只针对您的test文件夹,因此有一个干净的报告只集中在您的测试文件夹。
注意事项
请注意,使用测试子文件夹会妨碍覆盖率报告的计算。go的哲学是将测试文件留在包文件夹中。
ttygqcqt3#
把你的测试和你的代码放在同一个目录下的一个叫做file_test.go的文件中,“file”是你正在测试的源代码文件的名字,这是惯例,我发现这是我个人经验中最好的。如果go test工具的自动化程度还不够高,可以考虑一下**GoConvey**,它有一个Web用户界面,可以自动更新并运行传统的Go测试和GoConvey测试(GoConvey测试基于行为,比传统的Go测试更具自文档化功能)。
file_test.go
ldioqlga4#
我通常不做测试,但您可以将文件分组到目录中,并使用导入,如import "./models"如果是一级输出import "../models if是一个输出电平和一个输入电平例如,对于:./models/todo.go./test/todo_test.go要从todo_test.go测试todo.go,您在todo_test.go中的导入将是import "../models"
import "./models"
import "../models
./models/todo.go
./test/todo_test.go
todo_test.go
todo.go
import "../models"
4条答案
按热度按时间t2a7ltrp1#
请注意,您 * 可以 *“递归地”运行
go test
:你需要列出你要测试的所有软件包。如果您位于Go项目的根文件夹中,请键入:
'
./...
'符号在“commandgo
“的“程序包列表说明”一节中进行了说明:如果导入路径包含一个或多个“
...
“通配符,并且每个通配符都可以匹配任何字符串(包括空字符串和包含斜线的字符串),则导入路径是一个模式。这种模式扩展到
GOPATH
树中名称与模式匹配的所有包目录。作为特殊情况,
x/...
匹配x
以及x
的子目录。例如,
net/...
扩展为net
,并在其子目录中进行包。如果您将
_test.go
文件保存在子文件夹中,“go test ./...
”命令将能够拾取它们。但是:
话虽如此,我还是希望把
_test.go
文件放在主源文件旁边:就更容易找到。对于代码覆盖率:
参见Frédéric G. MARAND和
fgmarand/gocoverstats
中的“How to plot Go test coverage over time“,为Go项目的CI集成生成聚合覆盖率统计数据。而且
go-cover-treemap.io
也很有趣。如kbolino在注解中所述:
您可以将测试放在单独的包中,而不必将它们放在单独的目录中。
软件包foo的测试文件可以在软件包
foo_test
中,并且仍然在相同的目录中,同时 * 不 * 具有对软件包foo
的未导出(私有)成员的任何访问权限。3okqufwl2#
已编辑
基于VonC的回答
此答案在
go1.11
中有效。尚未在更高的go
版本中测试。对于那些喜欢将测试保存在子文件夹中的人,比如
test
,然后运行将尝试在 every 文件夹中运行测试,即使是那些不包含任何测试的文件夹,因此在非测试文件夹的后续报告中有
?
。跑步
相反,将只针对您的
test
文件夹,因此有一个干净的报告只集中在您的测试文件夹。注意事项
请注意,使用测试子文件夹会妨碍覆盖率报告的计算。go的哲学是将测试文件留在包文件夹中。
ttygqcqt3#
把你的测试和你的代码放在同一个目录下的一个叫做
file_test.go
的文件中,“file”是你正在测试的源代码文件的名字,这是惯例,我发现这是我个人经验中最好的。如果
go test
工具的自动化程度还不够高,可以考虑一下**GoConvey**,它有一个Web用户界面,可以自动更新并运行传统的Go测试和GoConvey测试(GoConvey测试基于行为,比传统的Go测试更具自文档化功能)。ldioqlga4#
我通常不做测试,但您可以将文件分组到目录中,并使用导入,如
import "./models"
如果是一级输出import "../models
if是一个输出电平和一个输入电平例如,对于:
./models/todo.go
./test/todo_test.go
要从
todo_test.go
测试todo.go
,您在todo_test.go
中的导入将是import "../models"