问题描述
在为 Go 项目编写单元测试的过程中发现,使用 go test
进行测试时,出现了报错:
...
flag provided but not defined: -test.testlogfile
...
经过查询和测试,这个问题是由于在定义 flag 之前就调用了 flag.Parse()
,而相关参数 -test.testlogfile
并不是我定义的,而是测试时创建的 flag。
在 stackoverflow 上看到了同样的问题,问题在于 go 1.13 对 testing
初始化的方式做了修改,查看源码发现, testing
包通过 testing.Init()
方法对相关参数进行初始化,调用了大量 flag.String()
等方法,然后是在 testing.MainStart()
中调用,然后在返回的 *M
对象的 (*M).Run()
方法中调用的 flag.Parse()
。
问题原因
由于 Go 的 Package 机制,import 的包会按照依赖关系进行初始化,而我在 main 包中,将 flag.Parse()
调用写在了初始化函数 init()
里,这会导致 go test
调用 testing.Init()
之前,flag 就已经解析完成,因此再添加 flag 就会出现报错。