在golang中使用子进程测试时如何生成单元测试覆盖率?

Ame*_*mer 4 unit-testing go

我有大部分代码的单元测试.但我无法弄清楚如何为主包中的main()中的某些代码生成单元测试覆盖率.

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

我尝试了子流程测试技术,但修改了代码,使其包含覆盖标记:

cmd := exec.Command(os.Args[0], "-test.run=TestMain -test.coverprofile=/vagrant/ucover/coverage2.out")
Run Code Online (Sandbox Code Playgroud)

以下是原始代码:https ://talks.golang.org/2014/testing.slide#23上述幻灯片的说明:http://youtu.be/ndmB0bj7eyw?t = 47m16s

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

我尝试尽可能多地实现代码覆盖.我不确定我是否遗漏了某些东西,或者是否有更简单的方法可以做到这一点.或者如果不可能的话.

任何帮助表示赞赏.

谢谢

阿梅尔

Von*_*onC 5

我采用了另一种不涉及重构main()的方法:看到这个提交:

我使用全局(未导出)变量:

var args []string
Run Code Online (Sandbox Code Playgroud)

然后main(),我使用os.Args除非设置私有var args:

a := os.Args[1:]
if args != nil {
    a = args
}
flag.CommandLine.Parse(a)
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我可以设置我想要的参数:

args = []string{"-v", "-audit", "_tests/p1/conf/gitolite.conf"}
main()
Run Code Online (Sandbox Code Playgroud)

我仍然实现了100%的代码覆盖率,甚至超过了main().


Jim*_*imB 4

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

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

func start(args []string) {
    // old main() logic
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以start()在不改变的情况下进行单元测试os.Args。