子目录中的Golang测试


120

我想在Go中创建一个带有测试和示例的包作为子目录,以保持工作区的清洁。这有可能吗?

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


5
注意:go test ./...将在当前文件夹所有子文件夹上运行测试。请参阅下面的答案
VonC


我在想同样的事。难以在单独的目录中进行测试,因为在同一级别上的diretor有sub dirs。
filthy_wizard

Answers:


201

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

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

go test ./...

./...”符号在“ 命令 ” 的“ 软件包列表说明 ” 部分中进行了描述go

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

这样的模式扩展到在 GOPATH名称与模式匹配的树中。

作为特殊情况,x/...匹配xx的子目录。
例如,net/...扩展为net并将其打包在其子目录中。


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

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

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


4
有人可能会说,不访问私人物品是正常的黑盒测试,而且效果更好。关于必须限定公共符号,您可以随时导入_“ ...”。
ddevienne 2015年

15

将测试和代码一起放在一个文件的同一目录中file_test.go,其中“文件”是您正在测试的源代码文件的名称。这是惯例,以我个人的经验,这是最好的。

如果该go test工具还不够自动化,您可能会考虑使用GoConvey,它具有一个Web UI,该UI会自动更新并运行传统的Go测试以及GoConvey测试(基于行为,并且更具自记录性)比传统的Go测试)。


2
GoConvey很棒(我正在等待高度期待的新UI)。我正在当前项目中使用它,例如github.com/VonC/asciidocgo/blob/master/abstractNode_test.go)。但是,go test也可以用于子文件夹。请参阅下面的答案
VonC

你是对的。实际上,它可能比我对这个问题的回答更相关。
马特

10

已编辑

基于VonC的答案,

此答案在中有效go1.11。尚未在鞋帮中测试go版本中。

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

go test ./...

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

跑步

go test ./.../test

相反,它只会定位到您的test文件夹,从而使干净的报告仅关注您的测试文件夹。

警告

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


1
很好的提示,除了我五岁的答案。Upvoted
VonC

亲爱的安娜,请解释什么不起作用?你的go版本是什么?你想做什么?后来我意识到,这种方法不允许计算代码覆盖率,这很可惜。你是这个意思吗?
avi.elkharrat

1
go test ./.../test返回go: warning: "./.../test" matched no packages//不仅针对测试文件夹。go版本go1.13 darwin / amd64
安娜

1
@Madeo,这很有意义,因为golang不会鼓励测试和代码的分离。异常是在以前的版本中允许它。
avi.elkharrat

1
@ avi.elkharrat,实际上,我决定不再采用这种方法,即使我希望将测试保存在单独的程序包/文件夹中=(
Madeo

-4

我通常不做测试,但是您可以将文件分组到目录中,然后使用import

import "./models" 如果是一级
import "../models如果是一级输出而又是一级输入

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

测试todo.gotodo_test.go,您在进口todo_test.go

import "../models"


这种导入代码的方法仅适用于公开的功能。即使您显式地将它们放在同一软件包中,它们的行为似乎也不像它们在同一软件包中。因此,该解决方案并不能真正解决单元测试的问题。
优美的企鹅,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.