我想在Go中创建一个包,并将包的测试和示例作为子目录,以保持工作区更干净。这可能吗?如果可能,怎么做?
所有的文档总是将测试代码放在与其他代码相同的位置,这在某种程度上更好还是只是惯例?
将你的测试和你的代码放在一个名为file_test.go的文件中的同一个目录中,其中“file”是你要测试的源代码文件的名称。这是惯例,根据我自己的经验,我发现这是最好的。
file_test.go
如果go test工具对你来说不够自动化,你可以看看< a href = " http:///goconvey。公司noreferrer“rel = > GoConvey < / >,它有一个web UI,可以自动更新和运行传统的Go测试以及godeliver测试(基于行为,比传统的Go测试更具自记录性)。
go test
我通常不做测试,但你可以将你的文件分组到目录中,并使用import
import "./models" if超出一级 import "../models if是一个level out和一个level in
import "./models"
import "../models
例如: ./models/todo.go < br > ./test/todo_test.go < / p >
./models/todo.go
./test/todo_test.go
从todo_test.go测试todo.go, 你在todo_test.go中的导入将是
todo_test.go
todo.go
import "../models"
注意,你可以“递归地”运行go test:你需要列出要测试的所有包。
如果你在Go项目的根文件夹中,输入:
go test ./...
'./...'符号在"包列表说明"节中描述。的“__abc3”;:
./...
如果导入路径包含一个或多个“..."通配符,每个通配符可以匹配任何字符串,包括空字符串和包含斜杠的字符串。 这样的模式扩展到在GOPATH树中找到的所有名称与该模式匹配的包目录。 作为特殊情况,x/...匹配x以及x的子目录。 例如,net/...展开为net,并在其子目录中进行打包
如果导入路径包含一个或多个“..."通配符,每个通配符可以匹配任何字符串,包括空字符串和包含斜杠的字符串。
...
这样的模式扩展到在GOPATH树中找到的所有名称与该模式匹配的包目录。
GOPATH
x/...
x
net/...
net
_test.go
话虽如此,我仍然倾向于将_test.go文件放在主源文件的旁边:它更容易找到。
对于代码覆盖:
go test -coverpkg=./... ./...
看到“如何规划Go测试覆盖率"从Frédéric G. MARAND和fgmarand/gocoverstats生成Go项目CI集成的汇总覆盖率统计。
fgmarand/gocoverstats
go-cover-treemap.io也很有趣。
go-cover-treemap.io
编辑
基于VonC的回答,
这个答案在go1.11中有效。尚未在上层go版本中测试。
go1.11
go
对于那些喜欢将测试保存在子文件夹中的人,比如test,然后运行
test
将尝试在每一个文件夹中运行测试,即使是那些不包含任何测试的文件夹,因此在非测试文件夹的后续报告中有?。
?
运行
go test ./.../test
而是只针对你的test文件夹,因此有一个干净的报告只关注你的测试文件夹。
谨慎
请注意,使用测试子文件夹将阻止覆盖率报告的计算。go的原理是将测试文件留在包文件夹中。