最近接触的项目涉及到C#开发的应用,测试过程当中咱们须要去分析C#的代码覆盖率,问了一些人,在网上也搜了一些,零碎的找到不少资料,可是都不是很完整,实际使用的过程当中仍是走了很多弯路。到如今为止,有两种可行的方案试验成功了,这里写出来给你们分享下。可能不少人都用过,就当是个整理吧。
方法一:使用VS自带的vsinstr工具
准备条件:安装VS2010或者VS2012。
基本的操做步骤,主要是三个。
1. 对被测的DLL进行插桩。
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Performance Tools\x64\vsinstr" -coverage "D:\xxx.dll"

原来的dll自动被改名为 *.orig,至关因而一个备份。能够看到被插桩的DLL尺寸有所增长。

2. 启动coverage数据监控和收集。
start vsperfmon -coverage -output:"D:\xyz.coverage" /CS /user:everyone


3. 运行被测的程序,或者等待被执行。
4. 停掉被执行的程序,能够直接关闭应用。
5. 中止coverage监听,生成数据。
vsperfcmd /shutdown


6. 找到D:\xyz.coverage,双击能够直接用VS打开查看。 显示的是block覆盖率,若是有source code能够对着代码查看。


方法一小结:
1. 这种方式除了最后查看报告,不须要启动VS,也不限制被测的代码如何被测试,能够手工也能够其余自动化程序。
2. 目前来看须要逐个DLL插桩,对于exe文件没有尝试。
3. 生成的覆盖率报告是二进制文件,须要在VS里面查看。
4. 目前看到的是只有block级别的覆盖率数据,没有找到line级别的。
方法二:使用免费的OpenCover工具
准备条件:
1. 安装OpenCover工具,能够直接下载msi或者zip包
2. 下载ReportGenerator工具,用于将OpenCover生成的XML报告转换成更加可读的HTML报告。
具体的步骤:
1. 在VS里面随便用C#写了一小段代码,包含了一个分支,用于查看覆盖和未覆盖的状况。编译成 ConsoleApplicaiton1.exe
2. 经过OpenCover将被测的ConsoleApplicaiton1.exe在命令行启动起来,加上相关的参数。
-output:c2.xml 指明将生成的报告文件名。
-targetdir: 告诉OpenCover这个exe对应的PDB在哪儿。两种方法PDB文件都是必须的。
-register 不是很清楚用途,可是是必须的,第一次没加这个参数覆盖率数据出不来。
更详细的参数请查看OpenCover的手册。
具体的命令:
OpenCover.Console.exe -register -target:"C:\Users\rickyqiu\Documents\Visual Studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe" -output:c2.xml -targetdir:"C:\Users\rickyqiu\Documents\Visual Studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug"
执行的结果以下面的cmd窗口。程序很简单,因此很快跑完了,显示了一个覆盖率的摘要。


这样就能够获得指定的报告文件 c2.xml了。
3. 能够用ReportGenerator工具生成HTML的报告便于查看。



因为这里有源码,因此HTML报告里面就直接显示了代码行级别的覆盖率。红色的部分是没有执行到的,绿色的是被执行到的。加起来是可覆盖(coverable)行。这里的概念都是比较通用的,和其余语言的覆盖率也是同样的。
方法二小结:
1. 这个方法没有显示的插桩(instrument)的动做,个人理解是在将被测程序启动的时候作了一些事情。试过多个文件包含exe和dll都是能够的。
下面是一个外面找到的实际的大一点的子项目代码的例子。


2. 能够直接看到line级别的覆盖率数据,有源码的话能够直接映射到源码,无源码是到文件级别的汇总数据。
3. 整个使用过程仍是很是方便的,不管是上面的demo console小程序,仍是这个有GUI的比较大的实际client。被启动后能够像单独运行时同样使用,无任何感知,因此对测试手段也没有要求,手工或者本身的自动化程序均可以。
4. 报告比较方便,特别是用ReportGenerator后。
还有一些待研究的:
1. 若是团队有多人一块儿执行测试,如何合并多人的覆盖率数据。
2. 若是是对于server端的程序,如何来处理。应该是能够作到,可是须要去验证。
总的来讲,不管那种方法提供的数据,对于咱们的测试都有很好的参考价值,是一个重要的辅助手段。
http://blog.csdn.net/superqa/article/details/9060521