2013-06-09 00:57 8149人阅读 评论(8) 收藏 举报
 分类:
软件质量(15) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

最近接触的项目涉及到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包
http://opencover.codeplex.com/wikipage?title=https%3a%2f%2fgithub.com%2fopencover%2fopencover%2freleases
 
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端的程序,如何来处理。应该是可以做到,但是需要去验证。
 
总的来说,无论那种方法提供的数据,对于我们的测试都有很好的参考价值,是一个重要的辅助手段。
 
 

在单元测试实践中经常会需要查看代码覆盖率,大多生成单元测试覆盖率的软件都是收费的。

开源的Coverage Tool不多,OpenCover是一个不错的选择。

参考:http://stackoverflow.com/questions/276829/code-coverage-for-c-net

http://www.codeproject.com/Articles/677691/Getting-code-coverage-from-your-NET-testing-using

1. 准备工具

NUnit或者MS Unit

OpenCover:从这里获取

ReportGenerator:https://github.com/danielpalme/ReportGenerator

你也可以从nuGet上获取,具体方法请自己百度

2. 配置环境

OpenCover使用起来并不复杂,只是配置路径有点麻烦。

运行OpenCover需要一系列参数,这里只说明几个主要的参数:

-target:这是目标应用或服务的路径(名称),这里指单元测试工具的路径,支持NUnit和MS Unit

-targetdir:目标目录的路径,如果target argument已经包含了一个路径,那么这个参数可以提供一个查找pdb文件的可选路径

-targetargs:target参数指定的应用所需要的参数(编译测试工程生成的一个dll文件或者EXE文件路径)

-output:输出XML文件的路径,如果没有提供将在当前目录下生成results.xml, 该文件将用于ReportGenerator生成可视化的覆盖率报告

ReportGenerator所需要的参数:

-reports:上述XML文件的路径

-targetdir:生成报告的目录

为了方便环境配置,本人采用了Python脚本跟ini配置文件的方式

下面是脚本程序跟配置文件,请根据项目实际情况配置路径:

  1. # run.py 只需执行这个脚本就可以生成可视化报告
  2. import configparser
  3. import os
  4. config = configparser.ConfigParser()
  5. try:
  6. config.read('config.ini')
  7. if 'Default' in config.sections():
  8. if 'opencoverpath' in config['Default'].keys():
  9. OpenCoverPath =  config['Default']['opencoverpath']
  10. if 'nunitpath' in config['Default'].keys():
  11. NUnitPath = config['Default']['nunitpath']
  12. if 'projdir' in config['Default'].keys():
  13. ProjDir = config['Default']['projdir']
  14. if 'projpath' in config['Default'].keys():
  15. ProjPath = config['Default']['projpath']
  16. if 'outpath' in config['Default'].keys():
  17. OutPath = config['Default']['outpath']
  18. if 'reportgenpath' in config['Default'].keys():
  19. ReportGenPath = config['Default']['ReportGenPath']
  20. if 'reporttargetdir' in config['Default'].keys():
  21. ReportTargetDir = config['Default']['ReportTargetDir']
  22. # print(OpenCoverPath)
  23. # print(NUnitPath)
  24. # print(ProjDir))
  25. # print(ProjPath)
  26. # print(OutPath)
  27. os.system('{0} -register:user -target:{1} -targetdir:{2} -targetargs:{3} -output:{4}'.format(OpenCoverPath, NUnitPath, ProjDir, ProjPath, OutPath))
  28. except e:
  29. print(e.message)
  30. else:
  31. os.system('{0} -reports:{1} -targetdir:{2}'.format(ReportGenPath, OutPath, ReportTargetDir))
  1. [Default]
  2. OpenCoverPath = D:\Reports\Tools\OpenCover\OpenCover.Console.exe
  3. NUnitPath = D:\Proj\packages\NUnit.Runners.2.6.4\tools\nunit-console-x86.exe
  4. ProjPath = D:\Proj\UnitTestProj\bin\Debug\UnitTestProj.exe
  5. ProjDir = D:\Proj\UnitTestProj\bin\Debug
  6. OutPath = D:\Reports\NUnitTest\coverage.xml
  7. ReportGenPath = D:\Reports\Tools\ReportGenerator\bin\ReportGenerator.exe
  8. ReportTargetDir = D:\Reports\CodeCoverage

注:一种简单的可选方案是直接将命令保存在文本文件里,需要运行时直接拷贝到命令窗口执行

3. 生成报告

运行上述run.py脚本即可,感受下:

C#代码覆盖率实践-vsinstr和OpenCover的更多相关文章

  1. C#代码覆盖率 -vsinstr和OpenCover

    最近接触的项目涉及到C#开发的应用,测试过程中我们需要去分析C#的代码覆盖率,问了一些人,在网上也搜了一些,零碎的找到很多资料,但是都不是很完整,实际使用的过程中还是走了不少弯路.到现在为止,有两种可 ...

  2. 好代码是管出来的——.Net Core中的单元测试与代码覆盖率

    测试对于软件来说,是保证其质量的一个重要过程,而测试又分为很多种,单元测试.集成测试.系统测试.压力测试等等,不同的测试的测试粒度和测试目标也不同,如单元测试关注每一行代码,集成测试关注的是多个模块是 ...

  3. VS社区版 使用 OpenCover 获取测试代码覆盖率

    注:暂不支持VS2017 Visual Studio 2015 社区版没有集成代码覆盖率的功能,所以想在VS社区版中获取单元测试的代码覆盖率等数据,需要使用到插件 OpenCover. 下载 Open ...

  4. VS2015+NUnit+OpenCover 完成单元测试代码覆盖率测试

    1.VS2015+NUnit+OpenCover 完成单元测试代码覆盖率测试 https://download.csdn.net/download/qq_39441918/10522539 2.*注意 ...

  5. MSTest/NUnit 单元测试 代码覆盖率试用 OpenCover 和ReportGenerator

    VS自带是单元测试代码覆盖率(VS自带这个是最佳选择)需要企业版才有.很蛋疼...... 1.下载安装OpenCover 和ReportGenerator. 关于这2个是干啥的百度下.简单说就是可以分 ...

  6. 聊聊Go代码覆盖率技术与最佳实践

    "聊点干货" 覆盖率技术基础 截止到Go1.15.2以前,关于覆盖率技术底层实现,以下知识点您应该知道: go语言采用的是插桩源码的形式,而不是待二进制执行时再去设置breakpo ...

  7. Python项目在Jenkins中的自动化测试实践(语法检查、单元测试,coverage(代码覆盖率)、自动打包)

    原始链接:http://blog.csdn.net/a464057216/article/details/52934077 requirments OS: Ubuntu 14.04+ Gitlab 8 ...

  8. fir.im weekly - 「 持续集成 」实践教程合集

    我们常看到许多团队和开发者分享他们的持续集成实践经验,本期 fir.im Weekly 收集了 iOS,Android,PHP ,NodeJS 等项目搭建持续集成的实践,以及一些国内外公司的内部持续集 ...

  9. Cobertura 代码覆盖率测试

    Cobertura 是一种开源工具,它通过检测基本的代码,并观察在测试包运行时执行了哪些代码和没有执行哪些代码,来测量测试覆盖率.除了找出未测试到的代码并发现 bug 外,Cobertura 还可以通 ...

随机推荐

  1. HDU2717-Catch That Cow (BFS入门)

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2717 Catch That Cow Time Limit: 5000/2000 MS (Java/O ...

  2. 河工大第十届ACM省赛随笔

    比赛成果达到了预期目标,不过还是很遗憾没有更进一步,刚到河工大的时候就想吐槽,拥挤的机房,难受的键盘鼠标,还有规定食堂的,饭票.一切都和河大比赛是给我的感觉不一样,再加上热身赛的那天我背着一大包东西, ...

  3. elk的安装部署

    Elk日志安装文档 需要用到有三个软件包 和redis 分布式部署:已上图就是分布式部署的架构图 Logstash :    是部署在前台的应用上,收集数据的 和部署在redis和elasticsea ...

  4. 安装最新nginx

    另外:http://nginx.org/en/linux_packages.html#mainline https://blog.csdn.net/hiram/article/details/5178 ...

  5. 【leetcode】234. Palindrome Linked List

    234. Palindrome Linked List 1. 使用快慢指针找中点的原理是fast和slow两个指针,每次快指针走两步,慢指针走一步,等快指针走完时,慢指针的位置就是中点.如果是偶数个数 ...

  6. 【letcode】5-LongestPalindromicSubstring

    回文串 回文串(palindromic string)是指这个字符串无论从左读还是从右读,所读的顺序是一样的:简而言之,回文串是左右对称的.一般求解一个字符串的最长回文子串问题. problem:Lo ...

  7. 格式化json

    格式化输出JSON var obj = {"args0":{"asynTarget":false,"atomicList":[{" ...

  8. [LeetCode&Python] Problem 543. Diameter of Binary Tree

    Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...

  9. root/base/stem概念

    The verb root (or base form): 1.is the same as the infinitive不定式 (e.g., to dive, to jump, to wonder) ...

  10. 51Nod 1007:正整数分组(01背包)

    1007 正整数分组  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 ...