我想在Go中创建一个包,并将包的测试和示例作为子目录,以保持工作区更干净。这可能吗?如果可能,怎么做?
所有的文档总是将测试代码放在与其他代码相同的位置,这在某种程度上更好还是只是惯例?
我想在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的原理是将测试文件留在包文件夹中。