过滤不需进行单元测试的包和类

[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 单元测试中的代码覆盖率...相关推荐

  1. mockito mock void方法_纯干货,浅谈Mockito在单元测试中的实际应用

    本文接上文"接口方没写代码,对接方只能停工吗?",在这里简单介绍Mockito在单元测试中的实际应用.本文使用场景较单一,如有雷同,不甚荣幸,闲言少叙,开门见山.本文将使用mock ...

  2. java resume过时方法_面试官没想到,一个 Java 线程生命周期,我可以扯半小时

    面试官:你不是精通 Java 并发吗?从基础的 Java 线程生命周期开始讲讲吧. 好的,面试官.吧啦啦啦... 如果要说 Java 线程的生命周期的话,那我觉得就要先说说操作系统的线程生命周期 因为 ...

  3. 使用 Cobertura 和反射机制提高 Java 单元测试中的代码覆盖率

    本文将介绍两种开发实践,用于提高 Java 单元测试中的代码覆盖率.代码覆盖率 = (被测代码 / 代码总数)* 100%.提高被测代码数量或降低代码总数,均可达到提高代码覆盖率的效果.在本文中,您将 ...

  4. IBM技术论坛:使用 Cobertura 和反射机制提高单元测试中的代码覆盖率

    引言 单元测试是软件开发过程中重要的质量保证环节.单元测试可以减少代码中潜在的错误,使缺陷更早地被发现,从而降低了软件的维护成本.软件代码的质量由单元测试来保证,而单元测试自身的质量与效率问题也不容忽 ...

  5. java 调用祖父方法_在Java中调用祖父母方法:您不能

    java 调用祖父方法 在文章保护的重点中,我详细介绍了"受保护"如何扩展"包私有"访问. 我在那儿写道: 你能做的是 覆盖子类中的方法或 使用关键字super ...

  6. java配置解决方法_如何配置Java环境变量及可能出现问题的解决方法

    配置java环境变量: 1.开发环境相关: 1)JDK:JavaDevelopmentKItJava开发工具包 2)JRE:JavaRuntimeEnvironmentJava运行环境 3)JVM:J ...

  7. 学java的正确方法_学习Java编程 这10个技巧不容错过--中享思途

    这是一个国外大神20多年的经验总结出来的-- "任何可能出错的事情,最后都会出错." 这就是人们为什么喜欢进行"防错性程序设计"的原因.偏执的习惯有时很有意义, ...

  8. java序列化的方法_【Java常见序列化与反序列方法总结】

    人和电脑在很多方面都是十分相似的,大脑可以看成电脑主机,五官/身体等表面器官就是显示器.鼠标等外设.这篇文章就是想把计算机跟人做类比YY一下序列化和反序列化的机制.用途. 如果你是初学者,心里肯定会问 ...

  9. java定义说话方法_类定义的基本形式_Java语言程

    类定义的基本形式_Java语言程 4.2.1 类定义的基本形式 前面一节我们已经了解了类和对象的概念,然而在实际编程过程中,该如何定义一个类以及类中的对象呢? 在Java语言中,用户自己可以定义一个类 ...

  10. 反射内存 延时_一种基于反射内存卡的OpenDDS分布式通信方法与流程

    本发明属于分布式通信技术领域,尤其涉及一种基于反射内存卡的OpenDDS分布式通信方法. 背景技术: 随着分布式系统复杂程度的不断增加和研发规模的迅速扩大,系统集成的难度和风险都在大幅提高.提供实时系 ...

最新文章

  1. 60、IPv6配置实验之RIP
  2. 多线程端点服务发布程序(摘)
  3. 使用tensorflow预测函数的参数值(a simple task)
  4. 使用pil读取gif图有些位置为黑色_使用 Pillow 快速创建 GIF 动图
  5. LinuxUNIX系统编程手册(英文版)pdf
  6. .NET Core WEB API中接口参数的模型绑定的理解
  7. setmonth_日期setMonth()方法以及JavaScript中的示例
  8. 泰晤士报下载_《泰晤士报》和《星期日泰晤士报》新闻编辑室中具有指标的冒险活动-第1部分:问题
  9. binaryviewer java_用java实现java的2进制文件字节序转换到C/C++的2进制文件字节序
  10. 靶形数独(信息学奥赛一本通-T1447)
  11. [转载] Python基于机器学习方法实现的电影推荐系统
  12. 计算机网络分层协议及各层功能
  13. Tracup:集成Bug追踪的轻量级项目管理平台
  14. 【逗老师的小技巧】群晖Synology更改存储池和存储空间编号
  15. 网站关键词排名优化中常见的问题及解决方法
  16. bugku md5加密相等绕过
  17. 不羡鸳鸯不羡仙,一行代码调半天。SpringBoot集成任务调度,实现每天定时发送天气预报,随时做好“广冻人”的心理准备
  18. 从Python到TensorFlow,差点把我 六年的电脑砸了,哈哈哈哈(详细安装入门步骤)
  19. 一个机械专业小混混 gooogleman 学习嵌入式ARM的真实经历
  20. DC / DC boost电路带闭环控制

热门文章

  1. redis实现订单过期取消
  2. 进程介绍(理论部分)
  3. Linux下的IO监控与分析
  4. Dubbo分析之Registry层
  5. mysql 8.0.11 Windows安装
  6. 《实施Cisco统一通信管理器(CIPT1)》一1.3 总结
  7. SessionID的传送
  8. UpdateData()函数使用
  9. doc.project java_GitHub - kanghaimeng/idoc: Generate doc for java maven project.(java 项目自动生成文档)...
  10. 大碰撞!当Linux多线程遭遇Linux多进程