golang 测试在 test.v 的标志解析上失败

Mar*_*ber -2 testing flags go goland go-testing

在我的 go 程序中,main 方法执行以下操作:

port := flag.Int("port", 8080, "Port number to start service on")
flag.Parse()
Run Code Online (Sandbox Code Playgroud)

我有一个虚拟测试,如下所示:

func TestName(t *testing.T) {
    fmt.Println("Hello there")
}
Run Code Online (Sandbox Code Playgroud)

当我运行测试(从 goland 或命令行)时,出现以下错误:

/usr/local/go/bin/go tool test2json -t /private/var/folders/7v/p2t5phhn6cn9hqwjnn_p95_80000gn/T/___TestName_in_github_tools....test -test.v -test.paniconexit0 -test.run ^\QTestName\E$
flag provided but not defined: -test.v
Usage of /private/var/folders/7v/p2t5phhn6cn9hqwjnn_p95_80000gn/T/___TestName_in_github_tools.....test:
  -port int
        Port number to start service on (default 8080)
Run Code Online (Sandbox Code Playgroud)

当我删除主文件中的标志行时,测试正常执行 请知道如何解决此问题?

提前致谢

LeG*_*GEC 6

当你运行时go test,go 实际上将你的代码编译成可执行文件并执行它。
如果将选项添加到go test-- 例如:go test -v-- 这些选项实际上会传递给测试可执行文件,前缀为test-- 所以-v会变成-test.v.

(这就是为什么有几个评论要求您用于运行测试的确切命令行的原因:因为错误是关于-test.v,所以可能有一些东西会添加-v到某些go test ...调用中)


看起来flag.Parse()正在尝试解析一些实际上用于测试可执行文件的参数,而不是用于您的代码。

这可能是因为在测试可执行文件有机会更改切片os.Args以删除某些特定标志之前调用得太早。

检查什么触发了对 的调用flag.Parse():如果它是从init()块执行的,则这将被视为“太早”。


选项的行为go test记录在go help testflag

这些标志中的每一个都可以通过可选的“测试”进行识别。前缀,如 -test.v 中所示。然而,当直接调用生成的测试二进制文件(“go test -c”的结果)时,前缀是强制性的。

在调用测试二进制文件之前,“go test”命令会在可选包列表之前和之后酌情重写或删除已识别的标志。

例如,命令

go test -v -myflag testdata -cpuprofile=prof.out -x
Run Code Online (Sandbox Code Playgroud)

将编译测试二进制文件,然后运行它

pkg.test -test.v -myflag testdata -test.cpuprofile=prof.out
Run Code Online (Sandbox Code Playgroud)