【问题标题】:Which methodology i should use to test func main() in golang?我应该使用哪种方法来测试 golang 中的 func main()?
【发布时间】:2018-07-11 04:21:46
【问题描述】:

我在 main.go 中有一个函数 main() 可以完成这项工作,所有其他函数都在它下面(我没有在这里包含它们)。因此,当我为 main 中包含的所有 funcs 编写测试时,我可以测试它们。但是代码覆盖率很低,因为它表明我没有覆盖我的main func 中的代码。

我知道测试库中有一个 TestMain func 应该可以完成这项工作,但我只是不知道如何让它工作,以便测试涵盖 func main()

下面是我的main() func,它没有被测试覆盖......

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

displaySlideshows(slideshows)

}

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

我将不胜感激!

【问题讨论】:

  • TestMain与测试main()无关。
  • 如果您在 main() 中有真正的功能,请将其移至其他位置以便于测试,然后让 main 调用它。

标签: testing go main


【解决方案1】:

您可以查看 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());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多