gpt4 book ai didi

unit-testing - 在 Golang 子进程测试中使用命令行标志时如何生成单元测试覆盖率?

转载 作者:IT王子 更新时间:2023-10-29 00:37:00 29 4
gpt4 key购买 nike

我对大部分代码进行了单元测试。但是我无法弄清楚如何为 main 包中的 main() 中的某些代码生成单元测试覆盖率。

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

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

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

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

我尝试实现尽可能多的代码覆盖率。我不确定我是否遗漏了什么或者是否有更简单的方法来做到这一点。或者,如果这是不可能的。

感谢任何帮助。

谢谢

阿米尔

最佳答案

我采用了另一种不涉及重构 main() 的方法:参见 this commit :

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

var args []string

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

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

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

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

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

关于unit-testing - 在 Golang 子进程测试中使用命令行标志时如何生成单元测试覆盖率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26022230/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com