JaCoCo 代码覆盖率测试工具集成

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ls0111/article/details/82692839

对于JaCoCo的介绍就不多说了,网上多的是介绍,不行也可以去官网查看一下就行了。相信大家也很不喜欢这类博客——开头不写怎么解决问题,而是给你讲背景、讲历史,讲了一堆。终于到解决问题的方法了,发现还不适用自己的情况。真是XXXX了。

所以,我先给出JaCoCo的官网,大家可以自行查看,相信看到官方给出的例子后,会觉得豁然开朗。

官网(包括下载资源):https://www.jacoco.org/

1.概要

首先,这篇博客主要是讲使用JaCoCo(主角) + Ant(编译以及测试报告生成) + Tomcat(部署项目的容器) + Linux(运行环境)集成后,启动Tomcat,对项目进行用例测试后,生成代码覆盖率测试报告的过程。

2.所需工具

各种环境(jdk、ant、tomcat等)就不多说了,这里主要使用到两个jar包:jacocoagent.jar + jacocoant.jar 与两个配置文件。

3.修改点

A. 下载上述两个jar包到linux服务器,我是放在/home/lys/jacoco/下面。
B. 在Tomcat的catalina.sh中加入配置:

JAVA_OPTS="-javaagent:/home/lys/jacoco/jacocoagent.jar=output=tcpserver,address=localhost"

C.创建build.xml,如下:

<?xml version="1.0" ?>
<project name="louys" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
    <!--Jacoco的安装路径-->
  <property name="jacocoantPath" value="/home/lys/jacoco/jacocoant.jar"/>
  <!--最终生成.exec文件的路径,里面有覆盖率数据,Jacoco就是根据这个文件生成最终的报告的-->
  <property name="jacocoexecPath" value="/home/lys/jacoco/report/jacoco.exec"/>
    <!--生成覆盖率报告的路径-->
  <property name="reportfolderPath" value="/lys/tomcat8.5.28/webapps/jacoco/"/>
  <!--服务的ip地址-->
  <property name="server_ip" value="localhost"/>
  <!--前面配置的服务打开的端口,要跟jacocoagent一样-->
  <property name="server_port" value="6300"/>
  <!--源代码路径-->
  <property name="checkOrderSrcpath" value="/lys/trunk/tyrcb/src/com" />
  <!--.class文件路径-->
  <property name="checkOrderClasspath" value="/lys/tomcat8.5.28/webapps/tyrcb/WEB-INF/classes/com" />
  <!--让ant知道去哪儿找Jacoco-->
  <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
      <classpath path="${jacocoantPath}" />
  </taskdef>
  <!--dump任务:
      根据前面配置的ip地址,和端口号,
      访问目标tomcat服务,并生成.exec文件。-->
  <target name="dump">
      <jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
  </target>

  <!--jacoco任务:
      根据前面配置的源代码路径和.class文件路径,
      根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->
  <target name="report">
      <delete dir="${reportfolderPath}" />
      <mkdir dir="${reportfolderPath}" />

      <jacoco:report>
          <executiondata>
              <file file="${jacocoexecPath}" />
          </executiondata>

          <structure name="JaCoCo Report">
              <group name="Check Order related">          
                  <classfiles>
                      <fileset dir="${checkOrderClasspath}" />
                  </classfiles>
                  <sourcefiles encoding="utf-8">
                      <fileset dir="${checkOrderSrcpath}" />
                  </sourcefiles>
              </group>
          </structure>
          <html destdir="${reportfolderPath}" encoding="utf-8" />        
      </jacoco:report>
  </target>
</project>

D.重启Tomcat后,就可以尽情你的测试用例了。
E.生成报告:
在你新建build.xml的目录下执行命令:

	ant dump
	ant report

最后就可以在配置文件中所配置的目录中生成测试报告了。
这里写图片描述

-----------------------------------------我------是------分------割------线 ----------------------------------------
简单说一下配置:
jacocoagent.jar看包名有个关键词“agent”代理!代理JVM进行JVM的监控与记录代码覆盖。
jacocoant.jar是通过ant命令进行报告生成使用。

catalina.sh配置参数:

JAVA_OPTS="-javaagent:/home/lys/jacoco/jacocoagent.jar=output=tcpserver,address=localhost"

首先指明代理是jacocoagent.jar,需要配置你的jar目录。output是覆盖数据(coverage data)输出的方式,有三个可配置的值:
**1.file:**当虚拟机关闭时,会把数据写入配置的文件中。所以该配置是不支持动态分析的,即服务必须停掉才能看到测试结果。
**2.tcpserver:**服务启动后,监听配置的address+port(这里没有配置,使用默认6300端口)TCP端口,即被当做服务器(tcpserver)
3.tcpclient:服务启动时会连接配置的端口号,此时可以理解为是客户端(tcpclient)
4.none不做任何输出。
这样就容易理解了。
还剩下
build.xml
,其实该配置文件里面已经描述的很清楚了。
仅说明一下报告的输出路径,我是直接输出到tomcat的weapps里面了,这样可以直接在浏览器中进行访问查看。

总结

其实,刚开始做这个任务的时候,上级是让使用Emma的,当时对这些测试工具完全不知道。查了一下这货的jarbk自从2010年就没有做维护了。等我自己配置的差不多了,启动时报错:

java.lang.ClassFormatError: Illegal local variable table length 403 in method ....

发现Emma不再支持jdk1.7或者说不能完美支持。这才发现Emma团队已经放弃Emma的维护了,重新开启了JaCoCo(Java Code Coverage)项目。所以建议大家使用最新的JaCoCo,如果遇到什么问题或有什么独到的见解,希望能与我分享讨论。谢谢!
-----------------------------------------我------是------分------割------线 ----------------------------------------
遇到的bug:
只提示:

BUILD FAILED
/usr/local/jacoco/build.xml:35: Error while creating report

而35行是jacoco:report标签那一行。
问题原因:
应该是源码与编译的class文件不一致导致,重新编译即可。

猜你喜欢

转载自blog.csdn.net/ls0111/article/details/82692839