由于项目CI方面需求,前段时间学习和使用了微软的代码覆盖率(Code Coverage)分析工具,当时着手做时,发现网上资料非常欠缺,遇到了不少坑,在此做个总结,希望能帮到有这方面需求的人。
Code Coverage,代码覆盖率,是CI的需求一部分。微软VS ultimate版本提供了测试Code Coverage的选项,也提供了相应的命令行工具。
使用微软命令行工具分析Code Coverage
- Instrument,可以理解为配备或准备的意思,这一步使用的工具Vsinstr.exe,它需要将被测程序集名称作为参数,主要作用是将需要测量的程序集分块,并插入监听程序,在这个工程中,需要程序集对应的PDB文件。
- 开启监听,并收集覆盖率。这一步用到的工具是Vsperfcmd.exe,它会开启一个监听程序Vsperfmon.exe,当Instrumented的程序集被覆盖到时,会Vsperfmon.exe会收到通知。
- 运行测试用例。
- 使用Vsperfcmd,输入与上面不同的参数,停止监听,生成Code Coverage报告。
遵循这四步的Workflow
- 首先安装需要分析Code Coverage的产品
- 将PDB拷贝到程序集所在的目录,这里需要注意的是,我们需要分析Code Coverage的程序集有可能并不是都在一个目录,这时,需要我们将PDB文件拷贝到多个地方。
- 编写脚本
- Instrumt
Vsinstr -coverage <myprojectbinary the dll/exe>
...
Vsinstr -coverage <myprojectbinary the dll/exe>
- 开始脚本
VSPerfCmd.exe /start:coverage /output:"*.Coverage"
或
Start vsperfmon -coverage -output:mytestrun.coverage
- 结束脚本
vsperfcmd –shutdown
- 运行开始脚本,这一步做的是Instrumt,并且开始监控
- 运行测试用例
- 运行结束脚本,这一步的作用是结束监听,并且生成报告
最后值得注意的事项
- 在分析Code Coverage的过程中,后台会启动一个VSPerfMon.exed的进程,用于收集Code Coverage信息,只要这个进程结束,收集会终止,所以在这个过程中,关机或者手动关闭这个进程,都会影响分析结果的准确性。
- 得到的*.coverage文件是与Instrumented的程序集以及PDB文件相关联的,如果需要保存和转移,微软官网给我们的建议是通过VS转换成XML格式。
- Instrument过程中需要程序集的名字作为参数,这意味着,如果我们项目工程增多了,需要对新增加的程序集进行分析,就需要修改脚本。
- 第四点值得开发人员注意,微软根据Block的概念计算Code Coverage,而Block的概念是与Instrumented 程序集中的CIL对应的,并不是我们实际的Code,所以我们如果我们从Code文本出发来理解VS中Code Coverage百分比时,往往会比较迷惑。实际上,我们也没有必要这样去做。
- Last but not least, 最权威的资料