java 反射覆盖方法_使用 Cobertura 和反射机制提高 Java 单元测试中的代码覆盖率...
过滤不需进行单元测试的包和类
[size=1.166em]针对项目中不需进行单元测试的包和类,我们可以利用 POM 文件中 Cobertura 的标注 (instrument) 设置,对相应的包和类进行剔除 (exclude) 或筛选 (include),使之不体现在覆盖率报告中,去除它们对整个覆盖率的影响,从而使报告更具针对性。其基本 POM 标签设置及解析如清单 3 中所示。清单 3. POM 中剔除包和类的设置示例[size=12.727272033691406px] exs/res/process/egencia/Mock*.class exs/res/process/test/**/*Test.class clean
[size=1.166em]通过在配置文件中使用 Include 与 Exclude,可以显式地指定哪些包和类被列入单元测试的统计范围,哪些包和类被剔除在此范围之外。正则表达式支持丰富的匹配条件,可以满足大多数项目对单元测试范围的要求。以上代码将 exs.res.process.egencia 下面所有的名称 Mock 开头的类,以及 exs.res.process.egencia.test 包下面以 Test 结尾的类都剔除在测试范围以外。在使用这种配置之后,代码整体的范围被缩小,因此在被覆盖到的代码数量不变的基础上,整个代码覆盖率会较以前提高。输出结果如图 2 所示。图 2. 包、类过滤效果
过滤类中的函数
[size=1.166em]最新版本中的 Cobertura 只能支持到类级别的过滤,而对于类中方法的过滤是不支持的。因此我们需要通过修改 Cobertura 源码,使 Cobertura 支持对类中方法的过滤。
[size=1.166em]对 Cobertura 及其插件改动所依据的主要原理是 : 修改 Cobertura-maven-plugin 项目中的 InstrumentationTask 类,增加 Ignoretrival,IgnoreMethod 等新增 POM 参数。配制正则表达式,修改 Cobertura 核心,在标注(instrumentation) 阶段遍历函数名时,检测函数名是否匹配传入的正则表达式,过滤函数体代码,从而把这些函数代码排除在代码覆盖统计之外,节省开发人员对这类代码的测试精力。
[size=1.166em]清单 4 至清单 6 是对 Cobertura 的几处核心改动,仅供读者参考。清单 4. 对 Cobertura 核心代码的改动之一[size=12.727272033691406px] private void checkForTrivialSignature() { Type[] args = Type.getArgumentTypes(myDescriptor); Type ret = Type.getReturnType(myDescriptor); if (myName.equals("")) { isInit = true; mightBeTrivial = true; return; } if (myName.startsWith("set") && args.length == 1 && ret.equals(Type.VOID_TYPE)) { isSetter = true; mightBeTrivial = true; return; } if ((myName.startsWith("get") || myName.startsWith("is") || myName.startsWith("has")) && args.length == 0 && !ret.equals(Type.VOID_TYPE)) { isGetter = true; mightBeTrivial = true; return; } }
清单 5. 对 Cobertura Maven plugin 的改动[size=12.727272033691406px]private String ignoreMethodAnnotation;private String ignoreTrivial;/** * 创建一个新的对象,用于进行配置。 */ public ConfigInstrumentation() /** * * 该方法用于设置annotation的名字以用于过滤类内部的方法 * @param ignoreMethodAnnotation */public void setIgnoreMethodAnnotation(String ignoreMethodAnnotation) { this.ignoreMethodAnnotation = ignoreMethodAnnotation;}public String getIgnoreTrivial() { return ignoreTrivial;}/** * 该方法用于标识测试类中的方法是否无关紧要不需要测试。 * @param ignoreTrivial */public void setIgnoreTrivial(String ignoreTrivial) { this.ignoreTrivial = ignoreTrivial;}
清单 6. POM 文件中使用修改后的 Cobertura 过滤类中的方法[size=12.727272033691406px] org.codehaus.mojo cobertura-maven-plugin 2.5.2 *main* true
[size=1.166em]以上修改都完成之后, 就可以运行“mvn:site”命令得到报告。图 4 是使用没有被修改的 Cobertura 产生的结果报告,无函数过滤效果。图 5 是使用被修改后的 Cobertura 产生的结果报告,可以从中看出,几个 set 与 get 方法已被排除在统计范围之外。图 4. 无函数名过滤效果
图 5. 增加函数过滤效果
java 反射覆盖方法_使用 Cobertura 和反射机制提高 Java 单元测试中的代码覆盖率...相关推荐
- mockito mock void方法_纯干货,浅谈Mockito在单元测试中的实际应用
本文接上文"接口方没写代码,对接方只能停工吗?",在这里简单介绍Mockito在单元测试中的实际应用.本文使用场景较单一,如有雷同,不甚荣幸,闲言少叙,开门见山.本文将使用mock ...
- java resume过时方法_面试官没想到,一个 Java 线程生命周期,我可以扯半小时
面试官:你不是精通 Java 并发吗?从基础的 Java 线程生命周期开始讲讲吧. 好的,面试官.吧啦啦啦... 如果要说 Java 线程的生命周期的话,那我觉得就要先说说操作系统的线程生命周期 因为 ...
- 使用 Cobertura 和反射机制提高 Java 单元测试中的代码覆盖率
本文将介绍两种开发实践,用于提高 Java 单元测试中的代码覆盖率.代码覆盖率 = (被测代码 / 代码总数)* 100%.提高被测代码数量或降低代码总数,均可达到提高代码覆盖率的效果.在本文中,您将 ...
- IBM技术论坛:使用 Cobertura 和反射机制提高单元测试中的代码覆盖率
引言 单元测试是软件开发过程中重要的质量保证环节.单元测试可以减少代码中潜在的错误,使缺陷更早地被发现,从而降低了软件的维护成本.软件代码的质量由单元测试来保证,而单元测试自身的质量与效率问题也不容忽 ...
- java 调用祖父方法_在Java中调用祖父母方法:您不能
java 调用祖父方法 在文章保护的重点中,我详细介绍了"受保护"如何扩展"包私有"访问. 我在那儿写道: 你能做的是 覆盖子类中的方法或 使用关键字super ...
- java配置解决方法_如何配置Java环境变量及可能出现问题的解决方法
配置java环境变量: 1.开发环境相关: 1)JDK:JavaDevelopmentKItJava开发工具包 2)JRE:JavaRuntimeEnvironmentJava运行环境 3)JVM:J ...
- 学java的正确方法_学习Java编程 这10个技巧不容错过--中享思途
这是一个国外大神20多年的经验总结出来的-- "任何可能出错的事情,最后都会出错." 这就是人们为什么喜欢进行"防错性程序设计"的原因.偏执的习惯有时很有意义, ...
- java序列化的方法_【Java常见序列化与反序列方法总结】
人和电脑在很多方面都是十分相似的,大脑可以看成电脑主机,五官/身体等表面器官就是显示器.鼠标等外设.这篇文章就是想把计算机跟人做类比YY一下序列化和反序列化的机制.用途. 如果你是初学者,心里肯定会问 ...
- java定义说话方法_类定义的基本形式_Java语言程
类定义的基本形式_Java语言程 4.2.1 类定义的基本形式 前面一节我们已经了解了类和对象的概念,然而在实际编程过程中,该如何定义一个类以及类中的对象呢? 在Java语言中,用户自己可以定义一个类 ...
- 反射内存 延时_一种基于反射内存卡的OpenDDS分布式通信方法与流程
本发明属于分布式通信技术领域,尤其涉及一种基于反射内存卡的OpenDDS分布式通信方法. 背景技术: 随着分布式系统复杂程度的不断增加和研发规模的迅速扩大,系统集成的难度和风险都在大幅提高.提供实时系 ...
最新文章
- 60、IPv6配置实验之RIP
- 多线程端点服务发布程序(摘)
- 使用tensorflow预测函数的参数值(a simple task)
- 使用pil读取gif图有些位置为黑色_使用 Pillow 快速创建 GIF 动图
- LinuxUNIX系统编程手册(英文版)pdf
- .NET Core WEB API中接口参数的模型绑定的理解
- setmonth_日期setMonth()方法以及JavaScript中的示例
- 泰晤士报下载_《泰晤士报》和《星期日泰晤士报》新闻编辑室中具有指标的冒险活动-第1部分:问题
- binaryviewer java_用java实现java的2进制文件字节序转换到C/C++的2进制文件字节序
- 靶形数独(信息学奥赛一本通-T1447)
- [转载] Python基于机器学习方法实现的电影推荐系统
- 计算机网络分层协议及各层功能
- Tracup:集成Bug追踪的轻量级项目管理平台
- 【逗老师的小技巧】群晖Synology更改存储池和存储空间编号
- 网站关键词排名优化中常见的问题及解决方法
- bugku md5加密相等绕过
- 不羡鸳鸯不羡仙,一行代码调半天。SpringBoot集成任务调度,实现每天定时发送天气预报,随时做好“广冻人”的心理准备
- 从Python到TensorFlow,差点把我 六年的电脑砸了,哈哈哈哈(详细安装入门步骤)
- 一个机械专业小混混 gooogleman 学习嵌入式ARM的真实经历
- DC / DC boost电路带闭环控制
热门文章
- redis实现订单过期取消
- 进程介绍(理论部分)
- Linux下的IO监控与分析
- Dubbo分析之Registry层
- mysql 8.0.11 Windows安装
- 《实施Cisco统一通信管理器(CIPT1)》一1.3 总结
- SessionID的传送
- UpdateData()函数使用
- doc.project java_GitHub - kanghaimeng/idoc: Generate doc for java maven project.(java 项目自动生成文档)...
- 大碰撞!当Linux多线程遭遇Linux多进程