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


方法局限

代码覆盖率的定义:对某一段代码或者代码的某一种属性做测试,其测试达到的程度被称为是覆盖率,比如对语句的覆盖,对分支或者条件的覆盖,等等。
计算方法:把现有的测试与可能执行的测试做比较,现有测试能够占总的可能执行的测试的多少比例。
覆盖率的经典定义没有考虑到一些情况,比如:
1. 输入特定的某个值或者某组值:边界值或者特殊的值;
2. 在编码中遗漏的代码:在代码中没有实现需求却要求的功能;
3. 中断,以及其他并行操作的情况。

Cem Kaner在他的著作“Software Negligence & Testing Coverage”里列举了101种这样的例子。
尽管覆盖率有一定的缺陷,但是还是需要量化的衡量维度(可扩充)。

工具调研

信息收集工具

市场上主要代码覆盖率工具:Emma、cobertura、jacoco、Clover(商用)。
覆盖粒度的具体意义?分支覆盖是指 if else的覆盖。
HUDSON:Java开发的一种持续集成工具。

具体见下表:

- jacoco emma cobertura
原理 使用ASM修改字节码 修改jar文件,class文件字节码文件 基于jcoverage,基于asm框架对class文件插桩
覆盖粒度 行,类,方法,指令,分支 行,类,方法,基本块,指令,无分支覆盖 项目,包,类,方法的语句覆盖/分支覆盖
插桩 on the fly、offline on the fly、offline offline,把统计代码插入编译好的class文件中
生成结果 在tomcat的catalina.sh配置javaangent参数,指出需要收集覆盖率的文件,shutdown时才收集,只能使用kill命令关闭tomcat,不要使用kill -9 html,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文件一模一样,比较适合白盒用例测试。

ECLEmma与EMMA的关系
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:用于在服务器端产生覆盖数据;命令行方式处理匹配结果;
Java代码覆盖率工具(Sonar+Jacoco)部署_第1张图片

由于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文件。如果有此文件,则部署成功。
Java代码覆盖率工具(Sonar+Jacoco)部署_第2张图片

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。
Java代码覆盖率工具(Sonar+Jacoco)部署_第3张图片

7.验证SonarQube是否正常运作:浏览器访问http://localhost:9000/ ,然后登陆,用户名:admin,密码:admin。
Java代码覆盖率工具(Sonar+Jacoco)部署_第4张图片

8.从SVN下载对应项目的源码包(包含Java文件及其他三方库等),源码包中需包含已经编译好的Class文件,如图所示。如果没有Class文件则可以从伺服服务器中将对应的Class文件下载到对应文件夹。
Java代码覆盖率工具(Sonar+Jacoco)部署_第5张图片

9.在项目文件中新增Sonar项目配置文件:sonar-project.properties,并在文件中设置项目的参数,供Sonar读取,以及Class文件的地址和结果文件的地址,供Sonar-Runner读取:
Java代码覆盖率工具(Sonar+Jacoco)部署_第6张图片

脚本代码参考:

# 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所在文件夹,将文件合并即可。
Java代码覆盖率工具(Sonar+Jacoco)部署_第7张图片

12.将Sonar的bin文件目录加到系统环境变量中
Java代码覆盖率工具(Sonar+Jacoco)部署_第8张图片

13.验证环境变量是否加入成功:打开cmd,直接输入sonar-runner.bat出现图中界面即成功。
Java代码覆盖率工具(Sonar+Jacoco)部署_第9张图片

14.命令行cmd执行匹配结果
1)打开项目及sonar-project.properties文件所在目录
cd [工程代码文件路径],并在此路径下启动sonar,执行sonar-runner.bat即可。
Java代码覆盖率工具(Sonar+Jacoco)部署_第10张图片

2)注意查看dos界面打印信息,如果有错误信息,需要及时改正后重试。
Java代码覆盖率工具(Sonar+Jacoco)部署_第11张图片

15.浏览器再次打开sonar出现刚刚匹配过的项目,点击preoject的黑色浮框,可以看到不同的颜色对应了不同的覆盖程度,颜色越红覆盖得越少,颜色越绿,覆盖得越多,点击不同的版块,可以看到版块内部的覆盖情况。
Java代码覆盖率工具(Sonar+Jacoco)部署_第12张图片

Java代码覆盖率工具(Sonar+Jacoco)部署_第13张图片

遗留问题

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”

你可能感兴趣的:(测试技术,测试,java,jacoco,sonar,代码覆盖率)