一、覆盖率定义

作为一个测试人员,保证产品的软件质量是其工作首要目标,为了这个目标,测试人员常常会通过很多手段或工具来加以保证,覆盖率就是其中一环比较重要的环节。

我们通常会将测试覆盖率分为两个部分,即“需求覆盖率”和“代码覆盖率”。

需求覆盖:指的是测试人员对需求的了解程度,根据需求的可测试性来拆分成各个子需求点,来编写相应的测试用例,最终建立一个需求和用例的映射关系,以用例的测试结果来验证需求的实现,可以理解为黑盒覆盖。

代码覆盖:为了更加全面的覆盖,我们可能还需要理解被测程序的逻辑,需要考虑到每个函数的输入与输出,逻辑分支代码的执行情况,这个时候我们的测试执行情况就以代码覆盖率来衡量,可以理解为白盒覆盖。

以上两者完全可以相辅相成,用代码覆盖结果反向的检查需求覆盖(用例)的测试是否充分完整。

二、jacoco简介

  jacoco是一个开源的覆盖率工具(官网地址:http://www.eclemma.org/JaCoCo/),它针对的开发语言是java,其使用方法很灵活,可以嵌入到Ant、Maven中;可以作为Eclipse插件,可以使用其JavaAgent技术监控Java程序等等。

很多第三方的工具提供了对JaCoCo的集成,如sonar、Jenkins等。

  JaCoCo包含了多种尺度的覆盖率计数器,包含指令级覆盖(Instructions,C0coverage),分支(Branches,C1coverage)、圈复杂度(CyclomaticComplexity)、行覆盖(Lines)、方法覆盖(non-abstract methods)、类覆盖(classes)。

On-the-fly插桩:

JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。

Offline模式:

在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩 的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。

On-the-fly和offline比较:

On-the-fly模式更方便简单进行代码覆盖分析,无需提前进行字节码插桩,无需考虑classpath 的设置。

存在如下情况不适合on-the-fly,需要采用offline提前对字节码插桩:

(1) 运行环境不支持java agent。

(2) 部署环境不允许设置JVM参数。

(3) 字节码需要被转换成其他的虚拟机如Android Dalvik VM。

(4) 动态修改字节码过程中和其他agent冲突。

(5) 无法自定义用户加载类。

三、JaCoCo使用:

1.下载jacoco.zip包

2.将jacoco的包传到/opt文件夹下

rz

3.在/opt下面建一个文件夹,因为jacoco.zip,解压后不会解压到自己的文件夹

mkdir jacoco

4.解压

unzip jacoco-0.8.1.zip

5.将jacoco的文件夹移动到/usr/local下面,方便管理

mv /opt/jacoco /usr/local

6.进入到bin目录下,停掉tomcat8082的服务

cd /usr/local/tomcat/tomcat8082/bin
./catalina.sh stop

7.找到tomcat8082/bin/catalina.sh文件并打开,添加jacoco插件,指令如下

vi /usr/local/tomcat/tomcat8082/bin/catalina.sh
JAVA_OPTS="-javaagent:/usr/local/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8044,address=127.0.0.1 -Xverify:none"

插入位置:

参数介绍:

(1)/usr/local/jacoco/lib/jacocoagent.jar按实际情况修改

(2)includes是指要收集哪些类(注意不要光写包名,最后要写.*),不写的话默认是*,会收集应用服务上所有的类,包括服务器和其他中间件的类,一般要过滤(当然如果你愿意写*也完全没有问题,如'includes=*')

(3)output有4个值,分别是file,tcpserver,tcpclient,mbean,默认是file。使用file的方式只有在停掉应用服务的时候才能产生覆盖率文件,而使用tcpserver的方式可以在不停止应用服务的情况下下载覆盖率文件,后面会介绍如何使用dump方法来得到覆盖率文件。

(4)address是IP地址,IP就是Tomcat服务器的机器的IP;这里我们要在tomcat服务器上执行ant dump,直接写127.0.0.1;

(5)port 是端口(端口比较随便,找个能用的端口就行);

(6)'-Xverify:none':这个参数是防止启动主程序异常才加的(非强制,可以不加);

8.启动tomcat8082

cd /usr/local/tomcat/tomcat8082/bin
./catalina.sh start

9.输入以下命令校验该步骤是否成功:

ps -ef|grep jacocoagent.jar

显示如下,说明成功了

10.选择任意目录,新建build.xml文件(这里我们还是选择/opt目录下新建),文件内容如下:

<?xml version="1.0" ?>
<project name="jacoco" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
<!--Jacoco的安装路径-->
<property name="jacocoantPath" value="/usr/local/jacoco/lib/jacocoant.jar"/>
<!--最终生成.exec文件的路径,Jacoco就是根据这个文件生成最终的报告的-->
<property name="jacocoexecPath" value="/opt/jacoco.exec"/>
<!--生成覆盖率报告的路径-->
<property name="reportfolderPath" value="/opt/jacoco_report"/>
<!--远程Tomcat服务的ip地址-->
<property name="server_ip" value="127.0.0.1"/>
<!--前面配置的远程Tomcat服务打开的端口,要跟上面配置的一样-->
<property name="server_port" value=""/>
<!--本地源代码路径,ps:此处Autotest为jenkins任务名称-->
<property name="checkOrderSrcpath" value="/root/.jenkins/workspace/Autotest/src/main/java"/>
<!--本地.class文件路径,ps:此处Autotest为jenkins任务名称-->
<property name="checkOrderClasspath" value="/root/.jenkins/workspace/Autotest/target/classes"/>
<!--让ant知道去哪儿找Jacoco-->
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${jacocoantPath}" />
</taskdef> <!--dump任务:
根据前面配置的ip地址,和端口号,
访问目标Tomcat服务,并生成.exec文件。-->
<target name="dump">
<jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="false"/>
</target> <!--jacoco任务:
根据前面配置的源代码路径和.class文件路径,
根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->
<target name="report">
<delete dir="${reportfolderPath}" />
<mkdir dir="${reportfolderPath}" /> <jacoco:report>
<executiondata>
<file file="${jacocoexecPath}" />
</executiondata> <structure name="JaCoCo Report">
<group name="Check Order related">
<classfiles>
<fileset dir="${checkOrderClasspath}" />
</classfiles>
<sourcefiles encoding="gbk">
<fileset dir="${checkOrderSrcpath}" />
</sourcefiles>
</group>
</structure> <html destdir="${reportfolderPath}" encoding="utf-8" />
</jacoco:report>
</target>
</project>

11.校验:进入到build.xml所在的目录,输入ant dump,如果出现如下信息,说明操作成功

四、jenkins配置与报告查看

1.打开jenkins,安装jacoco的插件

2.jenkins新建job及其相关设置

a.新建一个job,job的名字要跟上面下build.xml里面的名称保持一致

丢弃旧的构建不是必须的,看心情勾选就好。

跟你各自源码管理的凡是进行选择,此处我用的是git

未完待续。。。

最新文章

  1. angular2环境搭建
  2. 在 Mac OS X 上创建的 .NET 命令行程序访问数据库 (使用Entity Framework 7 )
  3. Quartz.NET总结(三)Quartz 配置
  4. Markdown--PDF--PPT--Flash 工具链
  5. 提升WordPress站点速度的八个建议
  6. selector是在文件夹drawable中进行定义的xml文件。
  7. word2013 无endnote选项卡咋办
  8. 给postgresql 创建新的用户
  9. Python之scrapy实例1
  10. HBase 运维分析
  11. [20190416]查看shared latch gets的变化.txt
  12. mysql查看存储过程函数
  13. zabbix/自动发现规则
  14. How do I convert an enum to a list in C#?
  15. 分享:三种取消选中单选框radio的方法
  16. 发送http请求
  17. Asp.Net Core 轻松学-一行代码搞定文件上传 JSONHelper
  18. Homebrew 的安装方法(官方的方法老师安装失败) 第三方
  19. Java多例模式
  20. RAW编程接口

热门文章

  1. 在每天黄金时刻将数据库中数据获取包装成Excel表
  2. 简洁js日历控件的使用
  3. 玄学C语言之scanf,printf
  4. iOS的设计备忘录/资源集合(新手快速开发)
  5. Vue相关问题
  6. python基础一 day13 迭代器
  7. XML解析(二) SAX解析
  8. 使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
  9. [LUOGU] P2679 子串
  10. MYSQL数据库SQL语句集锦