【问题标题】:go test can't find function in a same packagego test 在同一个包中找不到函数
【发布时间】:2013-02-06 06:49:42
【问题描述】:

目录结构为:

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

t1.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()
}

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

go test t1_test.go


错误:

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

但功能在那里

感谢任何提示

【问题讨论】:

标签: go


【解决方案1】:

它正在按预期工作。

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

【讨论】:

  • go test /abs/path/to/my/pkg 也可以。
【解决方案2】:

这在 Golang 中有些奇怪。老实说,我花了一些时间才找到出路。

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

恕我直言,最好的方法是保持清洁。因此,请避免每个测试文件有超过 1 个文件作为依赖项。如果您使用 +1 文件作为依赖项,请考虑使用 _test 包创建黑盒测试,并且不要使用任何小写内部变量。

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

【讨论】:

    【解决方案3】:

    运行

    go test ./...
    

    这将在所有测试文件中找到所有测试。要运行单个测试,请指定 here 之类的依赖项。

    【讨论】:

      【解决方案4】:

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

      我所要做的就是运行go mod init [module name],然后我可以运行go test而没有任何问题。

      希望这对使用更现代 (1.16+) 版本的 Go 后访问此页面的用户有所帮助。

      【讨论】:

        猜你喜欢
        • 2021-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2014-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多