我应该使用哪种方法来测试golang中的func main()?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我应该使用哪种方法来测试golang中的func main()?相关的知识,希望对你有一定的参考价值。
我在main.go中有一个函数main()
来完成这项工作,所有其他函数都在它下面(我没有在这里包含它们)。所以,当我为funcs
中包含的所有main
编写测试时,我可以测试它们。但代码覆盖率很低,因为它表明我没有覆盖我的main
函数的代码。
我知道测试库中有一个TestMain
函数可以完成这项工作,但是我无法知道如何让它工作,以便测试覆盖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)
}
另外,我在互联网上找不到太多关于它的信息,所以,如果这是一个愚蠢的问题,请向我解释为什么这是一个dum问题,我应该在哪里寻找解决方案!
我将不胜感激任何帮助!
你可以看看Filippo Valsorda的“Go coverage with external tests”:
我们创建一个执行
main()
的虚拟测试,我们将它放在构建标记后面,使用go test -c -cover
编译二进制文件,然后只运行该测试而不是运行常规二进制文件。这是
rrdns_test.go
文件的样子:
注意构建标记和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()); }
以上是关于我应该使用哪种方法来测试golang中的func main()?的主要内容,如果未能解决你的问题,请参考以下文章