原理篇
本次尝试的初衷在于想将代码覆盖率很好的用于手工项目实践(对用例执行的一个查漏补缺以及在手工测试结束后能够通过覆盖率增加代码上线信心);并且如果以后针该项目进行自动化接口测试,可以进行统计自动化覆盖率;鉴于项目内大部分同学还是学习的jacoco,所以本次参考了王女士的jacoco+jenkins方面的实践,做了一些学习。
首次去看jacoco的原理还是比较复杂的,但是基本上原理的核心围绕三大模块:
1. jacoco如何监听用户行为;
Jacoco有两大模块,Jacocoagent和Jacocoant。Jacocoagent作为服务,Jacocoant作为客户端。测试服务器上开启tcp端口,Jacocoagent作为服务跟随项目进程启动并监听测试过程、记录测试覆盖的数据,同时监听客户端Jacocoant通过Socket发送的请求,诸如生成测试覆盖率文件、映射源码得出测试报告等。
2. jacoco如何生成exec文件;
exec文件的生成主要靠jacocoant的配置文件build.xml发起请求,当测试完成后,执行ant dump命令,build.xml指定了要在哪个服务器端口下获取监听数据生成二进制覆盖率文件.exec以及指定文件存储位置;
3. jacoco如何将exec文件转化成html文件;
将exec转化成html报告主要需要三个关键成分,第一个是上一步生成的.exec文件;第二步是源码以及源码编译后的class文件下载和配置;
所有的过程可以通过build.xml文件来展示。
因为本次是结合了jenkins,而且刚开始接触覆盖率,所以很容易将很多的东西混淆;建议初学者一定要把jacoco的原理搞清楚了再去实践会有更好的体验;
提到jenkins,jenkins在本次的作用中有两点功能:
1.ant命令触发,构建jacoco所需要的exec文件以及报告
2.将报告展示在了jenkins自己的平台上面;
实践篇
因为本次是基于杭研本身的jenkins现有平台,所以主要的工程在于jenkins的配置以及build.xml的配置,以及在搞清楚原理下jacocoagent以及jacocoant的放置位置,具体如图展示:
主要执行步骤,
1.jekins上安装git插件,从git上获取源代码(当然需要在系统管理中配置git私钥的位置,这样才能从git上把代码拉下来)
2.jekins上安装maven插件,利用maven命令对项目进行编译,打包
3.jekins上安装ant插件,编写build.xml文件放下job路径下,执行dump命令,生成二进制覆盖率文件.exec放到指定文件,同时将jacocoagent的jar包以及参数配到web的节点机jvm(通过omad进行配置,或者才tomcat的catalina.sh文件中进行配置,参考本机配置的方法)上获取监控数据
4.jekins安装jacoco文件,读取二进制覆盖率文件,并比对class和src文件,生成覆盖率报表
Omad配置如下:
需要在实例里面去修改:
图2 omad触发jacocoagent包
Jenkins上的配置如下:
图3 jenkins上的jacoco配置
图4:构建后操作
核心build.xml的配置如下:
图5.配置各个路径
图6.各个ant执行任务
Jenkins上的展示:
图7.配置成功
踩坑篇
1.我开通的是个人sudo到公共账号,然后我通过jekins配置,为啥在服务器上看到jekins默认下载的路径是公共帐号下的?
原因:
jekins节点配置(我没有权限)
2.公共帐号没有办法下载git代码?
解决:
cd ./ssh
ssh-****** -b 1024 -t rsa
上传这对**的人可能已经离职了。 或者没有你这个项目的权限。
所以你自己重新生成一堆[复制的时候要生成rtf格式]
3.上传公钥的时候,每个账户都有.ssh公钥,每个账户下又不止一个公钥,那这个公钥是随便选的吗?还是需要指定某个帐号下特定的公钥
原因:
默认是用的是id_rsa这个命名的 ssh key
你要用别的名字,需要通过config文件来配置
比如:
http://doc.hz.netease.com/pages/viewpage.action?pageId=56646205
我这个文档写的。这里显式的指定了 用的 sa命名的key
去访问 g.hz.netease.com
4.build.xml遇上的问题
5.如何把我帐号(wb.zhangxj)下的一个build.xml文件copy到一个公共帐号下的qadev下的某个目录里面?
-----------------------如果是个文件-------------------------------
Step1:找到文件位置,输入tar cbuild.xml|nc -lp 9999;重新打开一个sessio
Step2:找到要粘贴的位置nc 127.0.0.19999|tar x
Step3:退出Ctrl+C
(解压tar -xvf)
--------------------如果是个文件夹-----------------------------------
Step1:先把ceshi文件夹压缩成 ceshi.tgz //tar -czvf ceshi.tar.gz *
Step2:然后执行tar xceshi.tgz|nc -lp 9999 tar x apache-tomcat-8.5.20.tar.gz|nc -lp 9999
Step3:再打开一个窗口,执行nc IP 9999 |tar x,切换到你想要复制的目录
6.jekins下jacoco图形展示破裂原因排查
排查:
1.没有形成exec文件
2.exec文件没有顺利转化成html reporter
由下往上排查,
1.主要核对build.xml文件,发现jacoco的安装路径出错
2.在build.xml所在的文件夹中,执行antdump,报端口号错误(之前写的是0000,http://blog.sina.com.cn/s/blog_4bdf819f0100vryh.html),修改成8494
3.修改了端口号后发现,timeout,查看端口是否起来
进入服务器,查看所起的端口是否起来:netstat -tlnp----8494没有起来
执行dump,连接不上,超时;将address修改成0.0.0.0,jenkins服务器和应用服务器连接不上的原因:
7.maven install
jenkins配置只拉了git代码,没有classes文件,所以手动上传编译后的.class文件
进入源码路径,输入mvn clean install.生成.class文件,配置在相应的路径下面
注意:Class文件需要与服务器一致
小结:
本次的实践主要发现自己很多知识的匮乏以及对Linux的不熟悉,但是通过实践可以提升自己的实践能力,也能对不足之处进行查漏补缺;
重要参考资料如下:
王女士的《基于jenkins的Jacoco自动化代码覆盖率统计》
美玲的《提升发布质量信心 ——代码覆盖率在手工测试上的实践》