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

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


当前回答

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

如果go测试工具对你来说不够自动化,你可以看看GoConvey,它有一个web UI,可以自动更新和运行传统的go测试以及GoConvey测试(基于行为,比传统的go测试更具自记录性)。

其他回答

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

如果go测试工具对你来说不够自动化,你可以看看GoConvey,它有一个web UI,可以自动更新和运行传统的go测试以及GoConvey测试(基于行为,比传统的go测试更具自记录性)。

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

进口”。/models”如果是一个级别 进口”. ./模型if是一层出一层进

例如,对于: /模型/ todo.go /测试/ todo_test.go

测试待办事项。从todo_test.go, 您在todo_test中的导入。Go将是

导入“. . /模型”

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

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

go test ./...

”。/…的符号在“命令行”的“包列表描述”一节中描述:

如果导入路径包含一个或多个“…”通配符,那么它就是一个模式,每个通配符可以匹配任何字符串,包括空字符串和包含斜杠的字符串。 这样的模式扩展到在GOPATH树中找到的名称与模式匹配的所有包目录。 作为特殊情况,x/…匹配x和x的子目录。 例如,net/..。展开到其子目录中的net和packages。


如果你保留你的_test。Go文件在子文件夹中,' Go test ./…'命令就能把它们捡起来。 但是:

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

话虽如此,我仍然倾向于保留_test。Go文件放在主源文件的右边:这样更容易找到。


对于代码覆盖:

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

参见Frédéric G. MARAND和fgmarand/gocoverstats中的“如何绘制Go测试覆盖率”,以生成Go项目CI集成的总体覆盖率统计数据。

也go-cover-treemap。IO很有趣。

编辑

基于VonC的回答,

这个答案在go1.11中有效。还没有在更高的版本测试。

对于那些喜欢将测试保存在子文件夹中的人,请键入“测试,然后运行”

go test ./...

将尝试在每个文件夹(甚至那些不包含任何测试的文件夹)中运行测试,从而具有?在非测试文件夹的后续报告中。

运行

go test ./.../test

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

谨慎

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