持续交付实践|基于 jacoco 的测试覆盖率统计平台实现

发表于:2018-5-02 11:16

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:cay    来源:51Testing软件测试网采编

  Jacoco简介
  Jacoco是一个开源的覆盖率工具。Jacoco可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序。很多第三方的工具提供了对Jacoco的集成,如sonar、Jenkins等。
  官网地址:http://www.eclemma.org/jacoco/
  支持的集成工具
  Jacoco团队提供了如下的一些集成工具的支持:
  Java API
  http://www.eclemma.org/jacoco/trunk/doc/api/index.html
  Command Line
  http://www.eclemma.org/jacoco/trunk/doc/agent.html
  Apache Ant
  http://www.eclemma.org/jacoco/trunk/doc/ant.html
  Apache Maven
  http://www.eclemma.org/jacoco/trunk/doc/maven.html
  Eclipse EclDmma Plugin
  http://www.eclemma.org/
  Jacoco与Eclipse集成
  打开 Eclipse 的软件市场,在其中搜索 EclEmma,找到后完成安装,如下图所示:
  安装完成后,Eclipse 的工具条里会多出下面这样一个图标:
  Jacoco与jenkins集成
  安装jacoco插件
  Jenkins中构建参数
  关键maven参数:
  mvn org.jacoco:jacoco-maven-plugin:prepare-agent  clean  package  -Dautoconfig.skip=true   -Dmaven.test.skip=false  -Dmaven.test.failure.ignore=true
  org.jacoco:jacoco-maven-plugin:prepare-agent:命令行引用jacoco-maven-plugin插件,减少对开发源码的依赖。
  -Dmaven.test.skip=false:启用代码中的单元测试,开发代码中一般默认是关闭的。
  -Dmaven.test.failure.ignore=true:忽略失败的单元测试用例继续执行。
  配置jacoco插件
  在“Addpost-build action”中选择“Reccord Jacoco coverage report”
  配置文件路径:
  Path to exec files :代码覆盖率统计文件位置;
  Path to class directorie:classes文件位置;
  Path to source directories:源码文件位置;
  根据需要填写覆盖率要求;
  Jacoco覆盖率报告
  Jacoco与Jenkins Pipeline集成
  可视项目和团队情况,增加对测试覆盖率的要求,比如下面例子就是当代码覆盖率低于70%时,这个阶段将会fail掉。
  Jacoco与SonarQube集成
  jacoco report报告路径配置
  代码覆盖率统计数据
  一些问题和解决方案
  坑1:使用了反射的单元测试用例执行报错:java.lang.NoSuchMethodException: com.greenline.expertpatient.model.po.EventRecordPO.set$jacocoData([Z)
  解决办法:
  To collect execution data JaCoCo instruments the classes under test which adds two members to the classes: A private static field $jacocoData and a private static method $jacocoInit(). Both members are marked as synthetic.
  Please change your code to ignore synthetic members. This is a good practice anyways as also the Java compiler creates synthetic members in certain situation.
  修改使用反射的测试用例,加个判断
  if(!fields[i].isSynthetic()){
  //Or whatever processing you are doing here with your fields.
  }
  参考链接:http://www.eclemma.org/jacoco/trunk/doc/faq.html
  坑2:multi-module maven项目,sonarQube只会检查指定parent module目录里的jacoco.exec覆盖率统计文件,而不会检查其他子module目录,即使在sonar里把sonar.jacoco.reportPaths设置成**/**.exec也不行(万马奔腾而过...)。
  解决办法1:
  jenkins jacoco plugin里没这个问题,代码覆盖率数据和报告可在jenkins上直接查看,sonarqube的问题等待社区后续完善。
  解决办法2:
  设置jacoco的destFile属性,合并所有的jacoco.exec报告到multiModuleProjectDirectory目录
  <jacoco.destFile>
  ${maven.multiModuleProjectDirectory}/target/jacoco.exec
  </jacoco.destFile>
  ${maven.multiModuleProjectDirectory}参数需要maven 3.3.1 以上版本支持。




上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号