我们团队一直在做自动化,自动化只是做了,成果可以替代部分手工回归,但是自动化究竟起了多少作用,覆盖率有多少,哈斯是没有具体的数据去统计,于是就在查找一款工具可以用来统计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工具还是很强大java覆盖率工具,在部署时,可以对特殊的地方进行打桩。
过程遇到的坑
在部署时,也遇到了很多坑,比如我们框架比较老,登录接口对布尔值不能识别,导致报如下错误信息,也想了很多办法解决
想得很多办法都被否定了,比如保持会话session,开发修改源码等,最后回归的还是工具本身的功能,将登录的class文件去除打桩,这样就很容易跳过了登录的问题。
第二个问题是在查找代码源文件时,总是报找不到源码的错误:
可能是测试,对功能不太熟悉,总是试了很多次,最后才知道是怎么回事,原来source file路径需要和--sourcefiles后面的路径拼成绝对路径,这样才是一个完整本地路径。
折腾了一番,最终效果出来了。我们的测试也慢慢偏向于灰度测试,对自动化覆盖率也有一个数据标准,更好的指导工作自动化方向,提高覆盖率,减少质量问题