测试无法在同一个包中找到函数

目录结构是:

src
src/pkg
src/pkg/t1.go
src/pkg/t1_test.go

开始

package pkg


import (
"fmt"
)


func SayHI(){
fmt.Println("this is t1")
}

T1 _ test. go

package pkg


import (
"testing"
)


func TestXYZ(t *testing.T) {
SayHI()
}

从目录 src/pkg的命令行调用 go test

go test t1_test.go


错误:

./t1_test.go:8: undefined: SayHI
FAIL    command-line-arguments [build failed]

但函数是存在的

谢谢你的提示

47300 次浏览

正如预期的那样。

jnml@fsc-r630:~/src/pkg$ go help test
usage: go test [-c] [-i] [build flags] [packages] [flags for test binary]


'Go test' automates testing the packages named by the import paths.
It prints a summary of the test results in the format:


ok   archive/tar   0.011s
FAIL archive/zip   0.022s
ok   compress/gzip 0.033s
...


followed by detailed output for each failed package.


'Go test' recompiles each package along with any files with names matching
the file pattern "*_test.go".  These additional files can contain test functions,
benchmark functions, and example functions.  See 'go help testfunc' for more.


By default, go test needs no arguments.  It compiles and tests the package
with source in the current directory, including tests, and runs the tests.


The package is built in a temporary directory so it does not interfere with the
non-test installation.


In addition to the build flags, the flags handled by 'go test' itself are:


-c  Compile the test binary to pkg.test but do not run it.


-i
Install packages that are dependencies of the test.
Do not run the test.


The test binary also accepts flags that control execution of the test; these
flags are also accessible by 'go test'.  See 'go help testflag' for details.


For more about build flags, see 'go help build'.
For more about specifying packages, see 'go help packages'.


See also: go build, go vet.
jnml@fsc-r630:~/src/pkg$

换句话说:

  • go test没问题。
  • go test pkg(假设 $GOPATH 是 ~ 并且包在 ~/src/pkg 中)是可以的。
  • go test whatever_test.go不行,因为上面的 记录在案不支持。

要选择运行哪些测试,请使用 -run <regular_expression>标志(其中 <regular_expression>被解释为在两端都有通配符,如 .*<regular_expression>.*)。比如说

$ go test -run Say # from within the package's directory

或者

$ go test -run Say my/package/import/path # from anywhere

这在 Golang 有点奇怪。老实说,我花了一些时间才想出一个解决办法。

一个简单的解决办法是将它们包括在命令中,例如: go test src/pkg/t1.go src/pkg/t1_test.go

恕我直言,最好的办法就是保持清洁。因此,避免在每个测试文件中使用多个文件作为依赖项。如果使用 + 1文件作为依赖项,请考虑使用 _test包创建一个黑盒测试,并且不要使用任何 lowerCase 内部 vars。

这将避免您在日常测试中处理复杂的依赖关系。

快跑

go test ./...

这将找到所有测试文件中的所有测试。

在我自己遇到完全相同的问题之后,我遇到了这个 Stackoverflow 问题: 具体来说,尝试运行 go test,然后看到一个构建失败,表明有问题的函数没有定义。我发现这个问题现在有点老了(8年前问过) ,但在我的例子中,问题是我试图在 Go 1.16中编写代码,现在似乎假设存在/使用模块。有关模块和简单的后续示例,请参阅 这一页

在我的情况下,我所要做的就是运行 go mod init [module name],然后我就可以毫无问题地运行 go test了。

希望这对使用更现代(1.16 +)版本 Go 之后访问这个页面的用户有一定的价值。