..
golang TestMain 方法
今天在执行 golang 的时候报了一个错误
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() 方法
flag.Parse()
在 testing 框架中也定义了 flag.StringXxxx 等方法,所以也会调用 flag.Prase() 来解析参数
if !flag.Prase() {
flag.Parse()
}
这样就导致 testing 框架定义的 flag.StringXxxx 没有被解析。这个这个问题的方式,是在 go test 的用例执行之前,flag.StringXxxx 定义之后调用 flag.Parse() , 这需要用到 TestMain 机制,当一个 golang test file 中包含有
func TestMain(t *testing.M){
}
函数时,其他的测试用例不会自动执行,而会触发执行 TestMain 参数, 所以我们可以编写 TestMain 参数如下:
func TestMain(m *testing.M) {
flag.Parse()
os.Exit(m.Run())
}
这里
m.Run
执行本文件中其他的测试函数,如果不调用 m.Run 那么 go test 永远返回 0 , 即使测试失败了。