我在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上没有找到太多相关信息,因此,如果这是一个愚蠢的问题,请向我解释为什么这是一个愚蠢的问题,我应该在哪里寻找解决方案!
我将不胜感激!
答案 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()); }