golang TestMain 方法

今天在执行 golang 的时候报了一个错误

1
2
3
flag provided but not defined: -test.testlogfile
Usage of /var/folders/lb/j0gz8jln36z4frqkrzmkdb0c0000gp/T/go-build200454244/b001/cc.test:
FAIL github.com/bla/cc 0.007s

这个的意思是,我没有定义 -test.testlogfile 但是参数解析参数的时候确有这个参数。这里报这个错的原因是测试代码写在main 包中,而 main 包中有一个 init 函数调用了 flag.Parse() 方法

1
flag.Parse()

在 testing 框架中也定义了 flag.StringXxxx 等方法,所以也会调用 flag.Prase() 来解析参数

1
2
3
if !flag.Prase() {
flag.Parse()
}

这样就导致 testing 框架定义的 flag.StringXxxx 没有被解析。这个这个问题的方式,是在 go test 的用例执行之前,flag.StringXxxx 定义之后调用 flag.Parse() , 这需要用到 TestMain 机制,当一个 golang test file 中包含有

1
2
3
func TestMain(t *testing.M){

}

函数时,其他的测试用例不会自动执行,而会触发执行 TestMain 参数, 所以我们可以编写 TestMain 参数如下:

1
2
3
4
func TestMain(m *testing.M) {
flag.Parse()
os.Exit(m.Run())
}

这里

m.Run

执行本文件中其他的测试函数,如果不调用 m.Run 那么 go test 永远返回 0 , 即使测试失败了。