问题描述

在为 Go 项目编写单元测试的过程中发现,使用 go test 进行测试时,出现了报错:

  1. ...
  2. flag provided but not defined: -test.testlogfile
  3. ...

经过查询和测试,这个问题是由于在定义 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 就会出现报错。

解决方法

变量声明

改变解析位置