Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Build 子目录中的Golang测试_Build_Go - Fatal编程技术网

Build 子目录中的Golang测试

Build 子目录中的Golang测试,build,go,Build,Go,我想在Go中创建一个包,并将该包的测试和示例作为子目录,以保持工作区更干净。这可能吗?如果可能,如何实现 所有文档都会将测试代码放在与其他代码相同的位置,这是更好的方法还是惯例?将测试与代码放在一个名为file\u test.go的文件中的同一目录中,其中“file”是您正在测试的源代码文件的名称。这是惯例,我发现这是我个人经历中最好的 如果go-test工具对您来说还不够自动化,您可以研究一下,它有一个web UI,可以自动更新和运行传统的go-tests以及gotransfer测试(基于行为

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


所有文档都会将测试代码放在与其他代码相同的位置,这是更好的方法还是惯例?

将测试与代码放在一个名为
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,事实上我已经决定不再使用这种方法,尽管我喜欢将我的测试保存在一个单独的包/文件夹中=(