最近接触的项目涉及到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插桩。
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端的程序,如何来处理。应该是可以做到,但是需要去验证。
 
总的来说,无论那种方法提供的数据,对于我们的测试都有很好的参考价值,是一个重要的辅助手段。

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

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

    C#代码覆盖率实践-vsinstr和OpenCover 标签: C#覆盖率Visual StudioOpenCover测试 2013-06-09 00:57 8149人阅读 评论(8) 收藏 举报   ...

  2. 基于Visual Studio .NET2015的单元测试 OpenCover

    https://www.cnblogs.com/XiaoRuLiang/p/10095723.html 基于Visual Studio .NET2015的单元测试 1.    在Visual Stud ...

  3. 基于Visual Studio .NET2015的单元测试

    基于Visual Studio .NET2015的单元测试 1.    在Visual Studio .NET2015中创建任意项目. 2.    在某个公共类的公共方法的名称上面点击右键,选择“创建 ...

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

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

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

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

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

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

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

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

  8. Jenkins结合.net平台工具之Opencover

    首先先介绍一下Opencover是什么,Opencover是.net平台下用于生成单元测试覆盖率报告的一款软件,是.net平台下为数不多的一款免费覆盖率报告工具,类似的工具还有Jetbrains的do ...

  9. [C#]使用 AltCover 获得代码覆盖率 - E2E Test 和 Unit Test

    背景 在 CI/CD 流程当中,测试是 CI 中很重要的部分.跟开发人员关系最大的就是单元测试,单元测试编写完成之后,我们可以使用 IDE 或者 dot cover 等工具获得单元测试对于业务代码的覆 ...

随机推荐

  1. Linux下Apache、PHP、MySQL默认安装路径

    Apache: 如果采用RPM包安装,安装路径应在 /etc/httpd 目录下 Apache配置文件:/etc/httpd/conf/httpd.conf Apache模块路径:/usr/sbin/ ...

  2. SqlServer_游标循环

    --从游标取的值 ) ) --获取待返现数据,并循环处理 DECLARE TestCursor CURSOR FOR SELECT ID,UserName FROM dbo.UserInfo Open ...

  3. oracle 性能优化建议

    原则一:注意WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHER ...

  4. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  5. Shadow Map 原理和改进 【转】

    http://blog.csdn.net/ronintao/article/details/51649664 参考 1.Common Techniques to Improve Shadow Dept ...

  6. jquery点击li标签之后在该li标签上添加一个class,点击下一个li时删除上一个li的class

    思路:点击当前li元素后是用removeClass()删除所有兄弟元素(使用siblings()获取)的class样式,然后使用addClass()为当前li添加class 具体演示如下: 1.HTM ...

  7. stylus使用文档总结:内置方法+参数+条件+迭代+导入+继承

    一.内置方法 返回各种颜色的比重(如red(color)等) 颜色函数是CSS预处里器中内置的颜色函数功能,这些功能可以对颜色值进行处理,例如颜色的变亮.变暗.渐变颜色等处理十分的方便. lighte ...

  8. 使用git-svn迁移SVN至GitLab

    使用git-svn迁移SVN至GitLab 1.安装git和git-svn 后面的步骤中对git版本有一定要求,通过yum安装的git版本较低,这里进行编译安装 [root@DevTest ~]# y ...

  9. (转)Linux下内存映射文件的用法简介

    简介: 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对 ...

  10. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...