近接触的项目涉及到C#开发的应用,测试过程中我们需要去分析C#的代码覆盖率,问了一些人,在网上也搜了一些,零碎的找到很多资料,但是都不是很完整,实际使用的过程中还是走了不少弯路。到现在为止,有两种可行的方案试验成功了,这里写出来给大家分享下。可能很多人都用过,当是个整理吧。

  方法一:使用VS自带的vsinstr工具

  准备条件:安装VS2010或者VS2012。

  基本的操作步骤,主要是三个。

  1. 对被测的DLL进行插桩。

  "C:Program Files (x86)Microsoft Visual Studio 10.0Team ToolsPerformance Toolsx64vsinstr" -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 ickyqiuDocumentsVisual Studio 2012ProjectsConsoleApplication1ConsoleApplication1inDebugConsoleApplication1.exe" -output:c2.xml -targetdir:"C:Users ickyqiuDocumentsVisual Studio 2012ProjectsConsoleApplication1ConsoleApplication1inDebug"

  执行的结果如下面的cmd窗口。程序很简单,所以很快跑完了,显示了一个覆盖率的摘要。