class文件插桩
beta机器部署
一、将附件中的installcover.tar.gz文件tar开,部署到/home/q目录下。
二、修改installcover用户:sudo chown tomcat:tomcat -R installcover
三、将附件中的(installcover_hprice)installcover_fpsystemManage上传到目录/etc/init.d目录下,并改名为installcover_服务名
chmod 755 installcover_服务名(服务名为/home/q/www/下面的工程名称)
四、修改文件:installcover_fpsystemManage中的service="fpsystemManage" 为service="服务名"
五、修改/home/q/tomcat/bin/startup.sh 脚本,在启动tomcat前,添加一句命令cd /home/q/installcover/服务名
(这是工具不够友好的地方,它需要在有可读写权限的目录下启动tomcat,因为需要产生一个临时锁文件。
这块后续会优化掉)
六、告知job名和installcover_服务名
添加相关服务
目前支持批量部署需要提供如下信息:
机器名 tomcat启动参数(例如:restart_tomcat.sh bnb.xxxx.com ,这列请填写bnb.xxx.
com) 服务脚本名
各列以空格分隔。
环境检查
以上部署完毕后,可以从jenkins中看到如上信息
直接build 构建,既可以得到带有插桩的版本。
清空service_name 选项,则可以发布不带有插桩的版本。
检查tomcat的日志:
Cobertura: Loaded information on 629 classes.
Cobertura: Saved information on 629 classes.
Cobertura: Loaded information on 629 classes.
Cobertura: Saved information on 629 classes.
看到如下信息,则说明加载正常,
请测试吧。
report信息查看
1、进入自动化测试平台:
在里面添加job:
2、修改配置项:
一、输入被测版本的branch tag
二、输入机器名
输入被测版本的branch tag 号 和需要对比版本的 tag号(一般默认是trunk)
三、查看build日志,在日志最后可以看到一个report url,
如:http://l-code.vy.corp.qunar.com:9001/cobertura/jenkins-cobertura_collect-52/
点击该url 即可查看整体代码覆盖率的详细信息,
输入:http://l-code.vy.corp.qunar.com:9001/cobertura/jenkins-cobertura_collect-52/diff/
即可看到svndiff代码覆盖率的相关信息
(以上两个范例url ,均可点击,bug和相关样式建议,请mail:zhaowen.cai@qunar.com)
手动部署覆盖率工具
class文件插桩
一、解开附件中的tar包,并放在/home/q目录下
二、将附件中的installcover_hprice中,installcover_服务名中的 engine_Master_Home
修改为engine_Master_Home="前部不修改部分/服务名/"
三、运行该脚本。
四、在/home/q/installcover 启动tomcat的restart命令
五、如上自动化部分的信息检查。
report信息查看
一、调用:sudo sh -x /home/q/installcover/cobertura/cobertura-report.sh --destination /home/zhaowen.cai/test3/ --datafile /home/q/www/installcover/cobertura.ser /home/zhaowen.cai/b-130322-143921-wenhua.cao/src/main/java
--destination:指定html文件report的生成位置
--datafile:指定cobertura.ser文件的位置
--format: 指定生成的report的格式,默认html,可以指定为xml,html ,summaryXml
最后源码位置:/home/zhaowen.cai/b-130322-143921-wenhua.cao/src/main/java
如果不指定源码位置,可以生成汇总报告,但无法看到具体的代码相关覆盖信息。
二、查看report ,推荐一个简单的方法
在--destination指定的目标目录下启动:python -m SimpleHTTPServer
在前端直接输入,http://机器名:8000
自动化环境部署覆盖率工具
class文件插桩
修改上面飘红部分为:Deploy-发布开发机(并启用覆盖率收集)
report信息查看
在测试用例job中添加如下配置:
参数说明:
1、$BUILD_TAG为默认参数
2、l-otstest2.h.beta.cn6为机器名
3、“provider user man task api”为服务名列表,中间以空格分隔
report的结果会反馈在log日志中,并且在每天下午发出的自动化报告中有相应的反馈数据。
问题跟进和解决
svndiff代码和覆盖率信息的结合
-----目前已经完成基本功能版本,可以输出相关信息,展示优化进行中。
可运行程序见附件svndiff_2.py
使用步骤:
1、安装类库
因beta机器python脚本较低,类库不全,需要安装相关类库。
解压附件中的elementtree-1.2.6-20050316.tar.gz
进入相应目录执行:sudo python setup.py install
安装完毕
2、获取覆盖率xml
执行:sudo sh -x /home/q/installcover/cobertura/cobertura-report.sh --destination /home/zhaowen.cai/test3/ --datafile /home/q/www/installcover/cobertura.ser --format xml /home/zhaowen.cai/b-130322-143921-wenhua.cao/src/main/java
具体解释见上。
3、执行脚本
python ./svndiff_2.py ./coverage.xml ./codediff ./ ./test/
参数1:覆盖率xml文件
参数2:svn diff 文件(svn diff tagurl1 tagurl2,其中tagurl1为新版本代码)
参数3:源代码读取路径,只需要指定到./b-130322-143921-wenhua.cao/src/main/java ,
后面以package名形成的目录,程序会自动识别
参数4:报告输出路径。
spring AOP和cobertura插桩冲突
问题:由于cobertura采用的CGLIB的方式进行插桩,但是由于应用可能默认使用的jdk自带的代理进行加载导致spring无法识别被代理proxy,所以需要在应用中强制指定使用cglib。
解决方案:适自己情况任意选择一种方式配置proxy-target-class="true"即可
<tx:annotation-driven proxy-target-class="true"/>
<aop:aspectj-autoproxy proxy-target-class="true"/>
<aop:config proxy-target-class="true"/>
想了解详细信息请移步spring的说明文档
spring文档说明:To be clear: using 'proxy-target-class="true"' on <tx:annotation-driven/>, <aop:aspectj-autoproxy/> or <aop:config/> elements will force the use of CGLIB proxies for all three of them.
wiki:http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch08s06.html
jar包的覆盖率统计
手工测试部分完成。
部署完可能出现的问题
问题1
部署了代码覆盖率的机器中的所有tomcat应用都无法启动,而且catalina.out中也没有日志
解决方法:
检查/home/q/tomcat/bin/startup.sh 是不是为空,如果为空,请从其他机器拷贝一个
问题2
部署了代码覆盖率的机器中的所有tomcat应用都无法启动,catalina.out中提示Warning:Faild to scan [file:/home/q/tomcat/lib/cobertura.jar] from classloader hierarchy
解决方法:
拷贝一个cobertura.jar到/home/q/tomcat/lib/