Jacoco代码覆盖率环境搭建及源文件was not found during generation of report问题解决

    我们团队一直在做自动化,自动化只是做了,成果可以替代部分手工回归,但是自动化究竟起了多少作用,覆盖率有多少,哈斯是没有具体的数据去统计,于是就在查找一款工具可以用来统计fugailv ,因为项目后台开发语言是java,选择了大众都在用的工具jacoco工具。

安装下载起服务:

jacoco工具下载地址:http://eclemma.org/jacoco/

jacoco官方文档地址:专业的人看专业的文档

jacoco工具下载之后,我们将jacocoagent.jar包放在服务器端。

jacoco服务器端命令:

JAVA_OPTS="$JAVA_OPTS -javaagent:/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=9999,address=ip"

JAVA_OPTS="$JAVA_OPTS -javaagent:[yourpath]=[options1]=[value1],[options2]=[value2]"

将本行代码放在catalina.sh文件的

#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"配置下面。

一般catalina.sh文件是在tomcat的bin目录下

字段解释:

选项 描述 默认
destfile 执行数据的输出文件的路径。 jacoco.exec
append 如果设置为true并且执行数据文件已经存在,则将覆盖数据附加到现有文件。如果设置为 false,则将替换现有的执行数据文件。 true
includes 执行分析中应包含的类名列表。列表条目以冒号(:)分隔,可以使用通配符(*和?)。除了性能优化或技术角落案例,通常不需要此选项。 * (所有类)
excludes 应从执行分析中排除的类名称列表。列表条目以冒号(:)分隔,可以使用通配符(*和?)。除了性能优化或技术角落案例,通常不需要此选项。 空(不排除类)
exclclassloader 应从执行分析中排除的类加载器名称的列表。列表条目以冒号(:)分隔,可以使用通配符(*和 ?)。如果特殊框架与JaCoCo代码工具发生冲突,特别是无法访问Java运行时类的类加载器,则可能需要此选项。 sun.reflect.DelegatingClassLoader
inclbootstrapclasses 指定是否还应该检测引导类加载器的类。谨慎使用此功能,需要大量包括/不包括调整。 false
inclnolocationclasses 指定是否还应该检测没有源位置的类。通常这样的类是在运行时产生的,例如通过模拟框架,因此在默认情况下被排除。 false
sessionid 与执行数据一起写入的会话标识符。没有这个参数,代理就会创建一个随机的标识符。 自动生成
dumponexit 如果设置为true覆盖数据,将在VM关闭时写入。如果file指定了转储,或者输出为tcpserver/ tcpclient 并且在虚拟机终止时连接处于打开状态,则只能写入转储。 true
output 用于写入覆盖率数据的输出方法。有效的选项是:
file:在虚拟机终止执行数据写入destfile属性中指定的文件。
tcpserver:代理侦听由address和port属性指定的TCP端口上的传入连接。执行数据被写入到这个TCP连接。
tcpclient:启动时,代理将连接到由address和port属性指定的TCP端口。执行数据被写入到这个TCP连接。
none:不要产生任何输出。
请参阅下面的安全考虑。
file
address 当输出方法为tcpserver或连接到 输出方法时要绑定的IP地址或主机名 tcpclient。在tcpserver模式中,值“ *”使代理接受任何本地地址上的连接。 回环接口
port 当输出方法是绑定的端口,tcpserver或者当输出方法是连接的端口tcpclient。在 tcpserver模式下,端口必须可用,这意味着如果多个JaCoCo代理应该在同一台机器上运行,则必须指定不同的端口。 6300
classdumpdir agent所调用到的所有class文件的目录。这可以用于调试目的,或者在动态创建类的情况下,例如当使用脚本引擎时。 没有转储
jmx 如果设置为true代理通过名称下的JMX 公开 功能org.jacoco:type=Runtime。请参阅下面的安全考虑。 false

部署好了之后,可以通过netstat -tulnp|grep port 查看端口是否正常启动,一般是将tomcat重启,jacocoagent.jar跟着正常起来。

生成exec文件

生成文件网上好多是根据ant.xml配置,等其他方式生成,我是利用jacococli.jar在本地直接生成exec文件

本地cmd窗口直接输入如下脚本:

java -jar jacococli.jar dump --address ip --port 9999 --destfile [path]\[execName].exec 

找到jacoco.jar包本地的地址,address地址是部署服务器地址,端口是第一步配置地址,destfile是生成exec的文件保存地址

生成报告

将服务器端的打桩的文件从服务器下载至本地,将git仓源码地址download到本地,进行文件的识别

本地cmd窗口输入如下脚本:

java -jar jacococli.jar report 【exec文件】 --classfiles 【class文件地址】 --sourcefiles 【源码地址】  --html 【报告生成位置】 --xml report.xml

这样就可以直接将打桩的文件拷贝至本地,在本地完成覆盖率

结果如下:

Jacoco代码覆盖率环境搭建及源文件was not found during generation of report问题解决_第1张图片

jacoco工具还是很强大java覆盖率工具,在部署时,可以对特殊的地方进行打桩。

过程遇到的坑

在部署时,也遇到了很多坑,比如我们框架比较老,登录接口对布尔值不能识别,导致报如下错误信息,也想了很多办法解决

Jacoco代码覆盖率环境搭建及源文件was not found during generation of report问题解决_第2张图片

想得很多办法都被否定了,比如保持会话session,开发修改源码等,最后回归的还是工具本身的功能,将登录的class文件去除打桩,这样就很容易跳过了登录的问题。

第二个问题是在查找代码源文件时,总是报找不到源码的错误:

Jacoco代码覆盖率环境搭建及源文件was not found during generation of report问题解决_第3张图片

可能是测试,对功能不太熟悉,总是试了很多次,最后才知道是怎么回事,原来source file路径需要和--sourcefiles后面的路径拼成绝对路径,这样才是一个完整本地路径。

折腾了一番,最终效果出来了。我们的测试也慢慢偏向于灰度测试,对自动化覆盖率也有一个数据标准,更好的指导工作自动化方向,提高覆盖率,减少质量问题

你可能感兴趣的:(Jacoco环境部署及问题,java)