我应该使用哪种方法在golang中测试func main()?

时间:2018-07-11 04:21:46

标签: testing go main

我在main.go中有一个功能main(),该功能可以完成工作,而所有其他功能都在其下面(我在此处未包括)。因此,当我为funcs中包含的所有main编写测试时,我可以对其进行测试。但是代码覆盖率很低,因为它表明我没有覆盖main函数的代码。

我知道测试库中有一个TestMain函数可以完成这项工作,但是我只是无法了解如何使其正常工作,因此测试涵盖了函数main()

下面是我的main()函数,测试未涵盖...

func main() {
c, err := getConfig()
if err != nil {
    log.Fatal(err)
}
slideshows, err := getSlideshows(c)
if err != nil {
    log.Fatal(err)
}

displaySlideshows(slideshows)

}

此外,我在Internet上没有找到太多相关信息,因此,如果这是一个愚蠢的问题,请向我解释为什么这是一个愚蠢的问题,我应该在哪里寻找解决方案!

我将不胜感激!

1 个答案:

答案 0 :(得分:1)

您可以通过 Filippo Valsorda 签出“ Go coverage with external tests”:

  

我们创建一个执行main()的虚拟测试,将其放在build标签之后,使用go test -c -cover编译一个二进制文件,然后仅运行该测试,而不运行常规的二进制文件。

     

rrdns_test.go文件的外观如下:

请注意build标记和package之间的空行:

// +build testrunmain

package main

import "testing"

func TestRunMain(t *testing.T) {
    main()
}
     

我们像这样编译二进制文件:

$ go test -coverpkg="rrdns/..." -c -tags testrunmain rrdns
     

然后,当我们想要收集覆盖率信息时,我们执行此操作而不是./rrdns(并像往常一样运行测试电池):

$ ./rrdns.test -test.run "^TestRunMain$" -test.coverprofile=system.out
     

您必须从main()干净地返回,才能将配置文件写入磁盘;在RRDNS中,我们通过捕获SIGINT来做到这一点。您仍然可以正常使用命令行参数和标准输入,只是请注意,您将从测试框架中获得两行额外的输出。

这类似于提出的this answer

func main() {
    os.Exit(doFunc());
}