在子目录中测试Golang

我想在Go中创建一个包,并将包的测试和示例作为子目录,以保持工作区更干净。这可能吗?如果可能,怎么做?

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

117786 次浏览

将你的测试和你的代码放在一个名为file_test.go的文件中的同一个目录中,其中“file”是你要测试的源代码文件的名称。这是惯例,根据我自己的经验,我发现这是最好的。

如果go test工具对你来说不够自动化,你可以看看< a href = " http:///goconvey。公司noreferrer“rel = > GoConvey < / >,它有一个web UI,可以自动更新和运行传统的Go测试以及godeliver测试(基于行为,比传统的Go测试更具自记录性)。

我通常不做测试,但你可以将你的文件分组到目录中,并使用import

import "./models" if超出一级
import "../models if是一个level out和一个level in

例如:
./models/todo.go < br > ./test/todo_test.go < / p >

todo_test.go测试todo.go, 你在todo_test.go中的导入将是

import "../models"

注意,你可以“递归地”运行go test:你需要列出要测试的所有包

如果你在Go项目的根文件夹中,输入:

go test ./...

'./...'符号在"包列表说明"节中描述。的“__abc3”;:

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

这样的模式扩展到在GOPATH树中找到的所有名称与该模式匹配的包目录。

作为特殊情况,x/...匹配x以及x的子目录。
例如,net/...展开为net,并在其子目录中进行打包

如果你将你的_test.go文件保存在子文件夹中,'go test ./...'命令将能够获取它们。
但是:< / p >
  • 您需要在导出的变量和函数(在测试中使用)前加上包的名称,以便测试文件能够访问包导出的内容。
  • 不能访问未导出的内容。

话虽如此,我仍然倾向于将_test.go文件放在主源文件的旁边:它更容易找到。


对于代码覆盖:

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

看到“如何规划Go测试覆盖率"从Frédéric G. MARANDfgmarand/gocoverstats生成Go项目CI集成的汇总覆盖率统计。

go-cover-treemap.io也很有趣。

编辑

基于VonC的回答,

这个答案在go1.11中有效。尚未在上层go版本中测试。

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

go test ./...

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

运行

go test ./.../test

而是只针对你的test文件夹,因此有一个干净的报告只关注你的测试文件夹。

谨慎

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