对于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文件不一致导致,重新编译即可。