Build 子目录中的Golang测试
我想在Go中创建一个包,并将该包的测试和示例作为子目录,以保持工作区更干净。这可能吗?如果可能,如何实现Build 子目录中的Golang测试,build,go,Build,Go,我想在Go中创建一个包,并将该包的测试和示例作为子目录,以保持工作区更干净。这可能吗?如果可能,如何实现 所有文档都会将测试代码放在与其他代码相同的位置,这是更好的方法还是惯例?将测试与代码放在一个名为file\u test.go的文件中的同一目录中,其中“file”是您正在测试的源代码文件的名称。这是惯例,我发现这是我个人经历中最好的 如果go-test工具对您来说还不够自动化,您可以研究一下,它有一个web UI,可以自动更新和运行传统的go-tests以及gotransfer测试(基于行为
所有文档都会将测试代码放在与其他代码相同的位置,这是更好的方法还是惯例?将测试与代码放在一个名为
file\u test.go
的文件中的同一目录中,其中“file”是您正在测试的源代码文件的名称。这是惯例,我发现这是我个人经历中最好的
如果
go-test
工具对您来说还不够自动化,您可以研究一下,它有一个web UI,可以自动更新和运行传统的go-tests以及gotransfer测试(基于行为,比传统的go-tests更能自我记录)。我通常不做测试,但您可以将文件分组到目录中,并像导入一样使用导入
导入“/models”
如果是一级输出import.。/models
if是一级输出和一级输入
例如,例如:/models/todo.go
/test/todo\u test.go
要从todo\u test.go
中测试todo.go
,
您在todo\u测试中的导入将被删除
导入“./models”
请注意,您可以“递归”运行go test
:您需要列出所有要测试的软件包
如果您在Go项目的根文件夹中,请键入:
go test ./...
“/…
”符号在“”的“”部分中描述:
如果导入路径包含一个或多个“…
”通配符,则导入路径是一种模式,每个通配符都可以匹配任何字符串,包括空字符串和包含斜杠的字符串
这种模式扩展到GOPATH
树中的所有包目录,其名称与模式匹配
作为特例,x/..
匹配x
以及x
的子目录。
例如,net/..
扩展到net
并在其子目录中打包
如果将\u test.go
文件保存在子文件夹中,则“go test./…
”命令将能够拾取这些文件。
但是:
- 您需要在导出的变量和函数(在测试中使用)前面加上包的名称,以便测试文件能够访问包导出的内容
- 您将无法访问未导出的内容
尽管如此,我还是希望将\u test.go
文件放在主源文件的旁边:这样更容易找到。经过编辑
基于VonC的回答
此答案在go1.11
中有效。在更高的go
版本中尚未测试
对于那些喜欢将测试保存在子文件夹中的人,可以说test
,然后运行
go test ./...
将尝试在每个文件夹中运行测试,即使是不包含任何测试的文件夹,因此在非测试文件夹的后续报告中有一个?
运行
go test ./.../test
相反,它将只针对您的test
文件夹,因此只有一个干净的报告专注于您的tests文件夹
小心
请注意,使用测试子文件夹将阻止覆盖率报告计算。go的发展哲学是将测试文件保留在包文件夹中。这种导入代码的方法仅适用于公开的函数。即使您明确地将它们放在同一个包中,它们的行为似乎也不像是在同一个包中。因此,这个解决方案并不能真正解决单元测试的问题。GoTransfer非常棒(我满怀期待地等待新的UI)。我正在我当前的项目中使用它,例如中)。但是,go test
也可以用于子文件夹。请看右边。事实上,它可能比我对这个问题的回答更相关。注意:go test。/…
将在当前文件夹和所有子文件夹上运行测试。请查看可能的副本,我认为sam一件事。把测试放在一个单独的目录上有困难,因为同一级别的目录有子目录。有些人可能会说,不访问私人内容是正常的黑盒测试,更好。关于必须限定公共符号,你总是可以导入“。。。“.除了我五年前的回答之外,还有一个很好的提示。亲爱的安娜,请解释什么不起作用?你对围棋的看法是什么?你想干什么?我后来意识到,这种方法不允许计算代码覆盖率,这是一个微不足道的问题。这就是您的意思吗?go-test./…/test
返回go:warning:“./…/test”匹配的无包
//不只是针对测试文件夹。go版本go1.13达尔文/amd64@Madeo,这是有道理的,因为golang不鼓励测试和代码分离。异常情况是允许在以前的版本中使用它。@avi.elkharat,事实上我已经决定不再使用这种方法,尽管我喜欢将我的测试保存在一个单独的包/文件夹中=(