我应该使用哪种方法来测试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()?的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用哪种 WPML 字符串翻译方法?

go如何把string类型转换成func

我应该使用(最快)哪种方法来选择元素?

应该使用哪种 PDO 绑定方法来提高安全性?

golang如何实现urldecode

golang在多个go routine中进行map或者slice操作应该注意的对象。