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

Testing 在golang中测试func main()应该使用哪种方法?,testing,go,main,Testing,Go,Main,我在main.go中有一个函数main(),用于执行该任务,所有其他函数都在它下面(我在这里没有包括它们)。因此,当我为main中包含的所有func编写测试时,我可以对它们进行测试。但是代码覆盖率很低,因为它表明我没有覆盖我的mainfunc中的代码 我知道测试库中有一个TestMainfunc应该做这项工作,但我就是不知道如何让它工作,以便测试覆盖funcmain() 下面是我的main() func main() { c, err := getConfig() if err != nil {

我在main.go中有一个函数
main()
,用于执行该任务,所有其他函数都在它下面(我在这里没有包括它们)。因此,当我为
main
中包含的所有
func
编写测试时,我可以对它们进行测试。但是代码覆盖率很低,因为它表明我没有覆盖我的
main
func中的代码

我知道测试库中有一个
TestMain
func应该做这项工作,但我就是不知道如何让它工作,以便测试覆盖func
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)
}

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

我将感谢任何帮助

您可以通过Filippo Valsorda查看“”:

我们创建了一个执行
main()
的虚拟测试,我们把它放在一个build标记后面,用
go test-c-cover
编译一个二进制文件,然后只运行该测试,而不是运行常规二进制文件

下面是
rrdns\u test.go
文件的外观:

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

我们按照如下方式编译二进制文件:

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

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

这类似于提议:


TestMain
与测试无关
main()
。如果main()中有真正的功能,请将它移到其他地方以便测试,然后让main调用它。
$ go test -coverpkg="rrdns/..." -c -tags testrunmain rrdns
$ ./rrdns.test -test.run "^TestRunMain$" -test.coverprofile=system.out
func main() {
    os.Exit(doFunc());
}