181

我想在 Go 中创建一个包,其中包含该包的测试和示例作为子目录,以保持工作空间更清洁。这可能吗?如果可以,怎么办?

所有文档总是将测试代码与其他代码放在同一个位置,这在某种程度上更好还是只是约定?

4

4 回答 4

292

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

如果您位于 Go 项目的根文件夹中,请键入:

go test ./...

' ./...' 符号在“命令”的“包列表描述”部分中进行了描述:go

如果导入路径包含一个或多个“ ...”通配符,则它是一种模式,每个通配符都可以匹配任何字符串,包括空字符串和包含斜杠的字符串。

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

作为一种特殊情况,x/...匹配x以及x's 子目录。
例如,net/...扩展net并打包到其子目录中。


如果您将_test.go文件保存在子文件夹中,“ go test ./...”命令将能够提取它们。
但:

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

话虽如此,我仍然希望将_test.go文件保留在主源文件旁边:它更容易找到。

于 2014-02-12T10:43:55.013 回答
20

已编辑

基于 VonC 的回答,

这个答案在go1.11. 尚未在更高go版本中进行测试。

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

go test ./...

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

跑步

go test ./.../test

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

警告

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

于 2019-06-06T14:56:37.547 回答
18

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

如果该go test工具对您来说不够自动化,您可以查看GoConvey,它有一个 Web UI,可以自动更新和运行传统的 Go 测试以及 GoConvey 测试(基于行为,并且更自文档比传统的 Go 测试)。

于 2013-10-05T18:32:30.567 回答
-6

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

import "./models"if 是一级输出
import "../modelsif 是一级输出和一级输入

例如,对于:
./models/todo.go
./test/todo_test.go

要测试todo.gotodo_test.go您的导入todo_test.go将是

import "../models"

于 2013-10-06T10:43:24.460 回答