您的位置:首页 > 编程语言 > Java开发

Java代码覆盖率工具(Sonar+Jacoco)部署

2017-01-04 15:35 543 查看

方法局限

代码覆盖率的定义:对某一段代码或者代码的某一种属性做测试,其测试达到的程度被称为是覆盖率,比如对语句的覆盖,对分支或者条件的覆盖,等等。

计算方法:把现有的测试与可能执行的测试做比较,现有测试能够占总的可能执行的测试的多少比例。

覆盖率的经典定义没有考虑到一些情况,比如:

1. 输入特定的某个值或者某组值:边界值或者特殊的值;

2. 在编码中遗漏的代码:在代码中没有实现需求却要求的功能;

3. 中断,以及其他并行操作的情况。

Cem Kaner在他的著作“Software Negligence & Testing Coverage”里列举了101种这样的例子。

尽管覆盖率有一定的缺陷,但是还是需要量化的衡量维度(可扩充)。

工具调研

信息收集工具

市场上主要代码覆盖率工具:Emma、cobertura、jacoco、Clover(商用)。

覆盖粒度的具体意义?分支覆盖是指 if else的覆盖。

HUDSON:Java开发的一种持续集成工具。

具体见下表:

-jacocoemmacobertura
原理使用ASM修改字节码修改jar文件,class文件字节码文件基于jcoverage,基于asm框架对class文件插桩
覆盖粒度行,类,方法,指令,分支行,类,方法,基本块,指令,无分支覆盖项目,包,类,方法的语句覆盖/分支覆盖
插桩on the fly、offlineon the fly、offlineoffline,把统计代码插入编译好的class文件中
生成结果在tomcat的catalina.sh配置javaangent参数,指出需要收集覆盖率的文件,shutdown时才收集,只能使用kill命令关闭tomcat,不要使用kill -9html,xml,txt,二进制格式报表html,xml
缺点需要源代码1、需要debug版本,并打来build.xml中的debug编译项; 2、需要源代码,且必须与插桩的代码完全一致1、不能捕获测试用例中未考虑的异常; 2、关闭服务器才能输出覆盖率信息(已有修改源代码的解决方案,定时输出结果;输出结果之前设置了hook,会与某些服务器的hook冲突,web测试中需要将cobertura.ser文件来回copy
性能小巧插入的字节码信息更多
执行方式maven,ant,命令行命令行maven,ant
jenkins集成生成html报告,直接与hudson集成,展示报告,无趋势图无法与hudson集成有集成的插件,美观的报告,有趋势图
报告实时性默认关闭,可以动态从jvm dump出数据可以不关闭服务器默认是在关闭服务器时才写结果
维护状态持续更新中停止维护(2005 http://www.eclemma.org/jacoco /trunk/doc/mission.html)停止维护
更多工具对比参考:https://confluence.atlassian.com/display/CLOVER/Comparison+of+code+coverage+tools

结果展示的工具

Jekins:代码集成工具,其中的插件Jacoco plugin可以根据.exec文件直接生成覆盖率报告,并在Jenkins中生成图表等。

Sonar:一个管理代码质量的开放式平台,可以用于做覆盖结果展示,可以具体看到覆盖到哪些源代码,做用例调整参考。

EclEmma:Eclipse的插件,可以用于做覆盖结果展示,可以具体看到覆盖到哪些源代码,做用例调整参考。它严格要求执行时的class文件与展示用的class文件一模一样,比较适合白盒用例测试。

ECLEmmaEMMA的关系

EclEmma 1.X 是基于Emma的eclipse图形版本,可以自动生成图片。2.X已经更换为基于jacoco,白盒测试覆盖工具。

Originally EclEmma was inspired by and technically based on the great EMMA library developed by Vlad Roubtsov.

调研结果

采用Sonar:覆盖结果展示;Jacoco:用于在服务器端产生覆盖数据;命令行方式处理匹配结果;



由于Jacoco在0.7.3之后有较大变动,为了在测试过程中不出现异常,在构建测试环境时需特备注意软件版本之间的关联,以下为典型的两种版本方案:

- 方案一:Jacoco0.7.4、 SonarQube -5.1.2、Javaplugin 3.1(sonar) 、Java 1.7+、SonarQube Scanner 2.6.1+

- 方案二:Jacoco0.7.5+、SonarQube-5.2+、Javaplugin 3.4(sonar)+ 、Java8+、SonarQube Scanner 2.6.1+

备注:版本号+为此版本以后的都可以兼容,Jacoco目前截止目前版本为0.7.7,SonarQube截止目前版本为5.6, SonarQube Scanner截止目前版本为2.6.1

实现方案

1.下载Jacoco并解压上传至服务器

http://www.eclemma.org/jacoco/index.html

2.在tomcat的catalina.sh文件中(图中位置)加上下面一段代码:指定javaangent的安装位置,指定结果文件jacoco.exec(运行后生成此文件)的位置。

if [ "$1" = "run" ]; then
JAVA_OPTS="-javaagent:XX/lib/jacocoagent.jar=destfile=XX/jacoco.exec"
elif [ "$1" = "start" ]; then
JAVA_OPTS="-javaagent:XX/lib/jacocoagent.jar=destfile=XX/jacoco.exec "
fi
export JAVA_OPTS


将jacoco的文件路径替换上文中的XX。如下图所示:



3.检验是否部署成功:

启动tomcat

在命令行输入ps -ef|grep tomcat,查看对应tomcat是否带有-javaagent参数,如下图,则配置成功。



刷新为jacoco安装目录,查看是否生成了jacoco.exec文件。如果有此文件,则部署成功。



4.做功能测试时,需要关闭tomcat获取结果文件jacoco.exec,不能使用用kill -9,否则不能生成结果,使用kill [进程号]

5.下载SonarQube并解压到本机。

http://www.sonarqube.org/downloads/

6.开启SonarQube:进入本地操作系统所对应的目录,比如本机操作系统为windows64位的,则进入sonarqube-5.1.2\bin\windows-x86-64目录,双击StartSonar.bat启动SonarQube。



7.验证SonarQube是否正常运作:浏览器访问http://localhost:9000/ ,然后登陆,用户名:admin,密码:admin。



8.从SVN下载对应项目的源码包(包含Java文件及其他三方库等),源码包中需包含已经编译好的Class文件,如图所示。如果没有Class文件则可以从伺服服务器中将对应的Class文件下载到对应文件夹。



9.在项目文件中新增Sonar项目配置文件:sonar-project.properties,并在文件中设置项目的参数,供Sonar读取,以及Class文件的地址和结果文件的地址,供Sonar-Runner读取:



脚本代码参考:

# must be unique in a given SonarQube instance
sonar.projectKey=projectName
# this is the name displayed in the SonarQube UI
sonar.projectName= projectName
#sonar.language=java
sonar.projectVersion=1.0

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# Since SonarQube 4.2, this property is optional if sonar.modules is set.
# If not set, SonarQube starts looking for source code from the directory containing
# the sonar-project.properties file.
sonar.sources=.
#sonar.binaries=C:/Users/Administrator/Desktop/codes/web/yyxw/WebRoot/WEB-INF/classes/com
sonar.java.binaries=C:/Users/Administrator/Desktop/codes/web/yyxw/WebRoot/WEB-INF/classes/com
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8

#Set jacoco Configuration
#Code coverage tool
sonar.java.coveragePlugin=jacoco
#Path to the JaCoCo report file containing coverage data by unit tests. The path may be absolute or relative to the project base directory
sonar.jacoco.reportPath=jacoco.exec
#Path to the JaCoCo report file containing coverage data by integration tests. The path may be absolute or relative to the project base directory
sonar.jacoco.itReportPath=jacoco.exec
#sonar.jacoco.reportMissing.force.zero
sonar.jacoco.reportMissing.force.zero=false


10.下载SonarQube Scanner:Sonar插件,读取sonar-project.properties用于扫描源码,将Jacoco数据结果文件对应到源码中去。

http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

11.安装SonarQube Scanner:将压缩包解压,粘贴复制到SonarQube所在文件夹,将文件合并即可。



12.将Sonar的bin文件目录加到系统环境变量中



13.验证环境变量是否加入成功:打开cmd,直接输入sonar-runner.bat出现图中界面即成功。



14.命令行cmd执行匹配结果

1)打开项目及sonar-project.properties文件所在目录

cd [工程代码文件路径],并在此路径下启动sonar,执行sonar-runner.bat即可。



2)注意查看dos界面打印信息,如果有错误信息,需要及时改正后重试。



15.浏览器再次打开sonar出现刚刚匹配过的项目,点击preoject的黑色浮框,可以看到不同的颜色对应了不同的覆盖程度,颜色越红覆盖得越少,颜色越绿,覆盖得越多,点击不同的版块,可以看到版块内部的覆盖情况。





遗留问题

1) Sonar+Jacoco为白盒测试提供参考。

2) 实践方面,如何融入到开发流程中。

3) 开发流程中需要注意的问题:单功能整体开发。

4) 数据库相关,Sonar使用的为默认内置的数据库,如果需要将Sonar配置在其他主机上,则要重新写配置文件和安装其他数据库,详细文档见官网。

5) Jacoco的数据结果每次都要手动去服务器下载,要自动下载结果需重新写配置文件。

扩展阅读

[1]. Jacoco官网 http://www.eclemma.org/jacoco/index.html

[2]. Sonar官网 http://www.sonarqube.org/

[3]. Cem Kaner .“Software Negligence & Testing Coverage”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息