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

问题描述

在我的 go 程序中,main 方法做了:

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)

当我在main中去掉flag的那几行,测试正常执行 请问您知道如何解决这个问题吗?

提前致谢

解决方法

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

(这就是为什么有几条评论要求您提供用于运行测试的确切命令行的原因:由于错误是关于 -test.v,因此可能有一些东西将 -v 添加到某些 {{ 1}} 次调用)


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

这可能是因为它被调用得太早,在测试可执行文件有机会改变 flag.Parse() 切片以删除某些特定标志之前。

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


init() 选项的行为记录在 go help testflag 中:

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

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

例如命令

go test

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

go test -v -myflag testdata -cpuprofile=prof.out -x