-4

在我的 go 程序中,主要方法是:

port := flag.Int("port", 8080, "Port number to start service on")
flag.Parse()

我有一个看起来像的虚拟测试:

func TestName(t *testing.T) {
    fmt.Println("Hello there")
}

当我(从 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)

当我删除主要标志的行时,测试正常执行关于如何解决这个问题的任何想法,好吗?

提前致谢

4

1 回答 1

2

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

(这就是为什么有几条评论要求您提供用于运行测试的确切命令行的原因:由于错误是 about -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

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

pkg.test -test.v -myflag testdata -test.cpuprofile=prof.out
于 2021-05-06T15:23:58.353 回答