我有大部分代码的单元测试.但我无法弄清楚如何为主包中的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
但它不会生成封面配置文件.我一直无法弄清楚为什么不.它确实为主进程执行测试生成封面配置文件,但当然,在子进程中执行的任何代码都不会标记为已执行.
我尝试尽可能多地实现代码覆盖.我不确定我是否遗漏了某些东西,或者是否有更简单的方法可以做到这一点.或者如果不可能的话.
任何帮助表示赞赏.
谢谢
阿梅尔
我采用了另一种不涉及重构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().
我会考虑需要测试的逻辑main():
func main() {
start(os.Args)
}
func start(args []string) {
// old main() logic
}
Run Code Online (Sandbox Code Playgroud)
这样你就可以start()在不改变的情况下进行单元测试os.Args。
| 归档时间: |
|
| 查看次数: |
1091 次 |
| 最近记录: |