一尘不染

在Golang中使用子流程测试时,如何生成单元测试覆盖率?

go

我对大多数代码都有单元测试。但是我无法弄清楚如何为main包中的main()中的某些代码生成单元测试覆盖率。

主要功能非常简单。它基本上是一个选择块。它读取标志,然后调用另一个函数/执行某些操作,或仅在屏幕上打印帮助。但是,如果命令行选项设置不正确,它将退出并显示各种错误代码。因此,需要进行子过程测试。

我尝试了子流程测试技术,但修改了代码,以使其包括覆盖率标志:

cmd := exec.Command(os.Args[0], "-test.run=TestMain -test.coverprofile=/vagrant/ucover/coverage2.out")
这是原始代码:https :
//talks.golang.org/2014/testing.slide#23上面幻灯片的说明:http
//youtu.be/ndmB0bj7eyw?t=47m16s

但是它不会生成封面资料。我一直无法弄清楚为什么不这样做。它确实为执行主流程的测试生成封面配置文件,但是在子流程中执行的任何代码当然都不会标记为已执行。

我尝试实现尽可能多的代码覆盖率。我不确定我是否缺少某些东西,或者是否有更简单的方法来做到这一点。或者,如果不可能的话。

任何帮助表示赞赏。

谢谢

阿米尔


阅读 216

收藏
2020-07-02

共1个答案

一尘不染

我会考虑需要测试的逻辑main()

func main() {
    start(os.Args)
}

func start(args []string) {
    // old main() logic
}

这样,您可以进行单元测试start()而不会发生变化os.Args

2020-07-02