游侠客饭馆自动化360度质保体系

作者:亚搏app官网    发布时间:2020-02-09 12:43    浏览:53 次

[返回]

作者:王幸福

Java Jacoco Ant Maven

编辑:雨多田光

近期因工作需要,需对代码覆盖率进行统计,所以这篇就当做对这段时间学习的总结。
总得来说网上找到的资料都不系统,不适合新手理解和参考,下面我就以我一个小白的亲身体验,将我
踩到的那些坑和遇到的那些疑惑记录下来
(作为一名初学者,文章中可能会有错误或者理解偏差的地方,欢迎各位批评指正)

前 言

  • 针对Jacoco+Jenkins+SonarQube&SonarQube Scanner分为八个部分写的,提出阅读的逐生机勃勃为:
    1. Jacoco Code Coverage ⇦
    2. Jenkins + Jacoco 持续集成代码覆盖率
    3. SonarQube & SonarQube Scanner
    4. Jenkins + SonarQube & SonarQube Scanner

游侠客这两天数不胜数的框架和品种都在往 Java 技艺栈上举办搬迁。在此个历程中我们相见不菲的挑衅和困难,为此大家在原来测试系统的幼功上做了大气的做事,构建了一条龙使得的身分保障类别。本文的初步部分会给大家介绍下近期酒馆测验系统的片段气象,后边则会详细地介绍下那几个系统的后生可畏有的——Java 覆盖率总结平台。


360 度质保连串多如牛毛的测量试验系统

代码覆盖率工具应用研讨音信如下:

我们相近的测量检验系统日常如下图所示:

  • 市情上海重机厂点代码覆盖率工具:
    • Emma
    • Cobertura
    • Jacoco
    • Clover(商用)

效率测验、自动化测量试验等那个测验阶段和行事都以围绕着被测系统举行的,所以我们得以形象地把它们的涉及作为贰个360 度的环,而被测系统则被围在了环的中心,就如被保镖珍惜起来的关键人物日常。

切切实实见下表:

那超级轻便想到的是,那些环上的保镖更加的多,围得越密,被保安的人自然就越安全。当然,保镖也是亟需花费的,假如被保护的人不是那么主要,当然也就用持续那么多的掩护。所以,根据被测系统的重大以致资本的杜撰,不一样的厂家对质保系列有着差异考虑衡量

工具 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出数据 可以不关闭服务器 默认是在关闭服务器时才写结果
维护状态 持续更新中 停止维护 停止维护

驴妈妈酒馆 360 度质量保险体系

Tip:Jacoco也是Emma团队开发的

乐途饭馆的 360 度质保种类的主导正是 自动化,该种类在观念的品质体系中追加了一些“保镖”,非常的是,在那之中部分“保镖”是机器人。这么做既扩大了被测系统的安全性,也方便地降落了资金财产。同一时间,利用自动化,持续集成、API 测量检验与监察和控制预先警告的身分和成效都赢得了越来越好的保险。


单元测验


单元测量检验作为代码等级的材质有限扶助手段,有其不可替代的坚决守住。就算,马蜂窝旅社的火速开辟中并不曾强逼举办TDD 或 BDD 那类的实施。但作为自动化测验之外有利的补给,也是讲求对于自动化测量检验或然手工业测量检验不能有效测量试验的意气风发部分,编写单元测量试验用例举行测量试验。

JaCoCo Java Code Coverage Library

每每集成

Jacoco是三个开源的覆盖率工具。Jacoco能够松开到Ant 、Maven中,并提供了Ecl埃玛 Eclipse插件,也能够选用Java Agent本事监察和控制Java程序。超多第三方的工具提供了对Jacoco的合併,如sonar、Jenkins、IDEA.

时下客栈测量检验自动化平台和携程发布系统进行整合,每一回应用在拆穿连串中发布,自动化测验平台都会举办测量检验用例的实行,并发送测量试验报告给测验职员。

Java Counters

测验人士收到告知后会对停业的用例进行解析,若是有标题就记入 Bug,假如是用例本人的标题,则改革测量检验用例。

Jacoco包括了二种标准的覆盖率流速计,满含指令级(Instructions,C0 coverage卡塔尔,分支(Branches,C1 coverage)、圈复杂度(Cyclomatic ComplexityState of Qatar、行(Lines卡塔尔(قطر‎、方法(Non-abstract MethodsState of Qatar、类(Classes卡塔尔(قطر‎。

日前饭馆测量检验持续集成包罗了 API、UI 以致 Job 这二种自动化测验,且除了 UI 自动化之外都贯彻了无码测验用例的编写制定,测量试验职员可以很省心地编写和维护相应的测验用例

➢ Instructions:Jacoco计算的最小单位就是字节码指令。指令覆盖率表明了在所有的指令中,哪些被指令过以及哪些没有被执行。这项指数完全独立于源码格式并且在任何情况下有效,不需要类文件的调试信息。

购并测验

➢ Branches:Jacoco对所有的if和switch指令计算了分支覆盖率。这项指标会统计所有的分支数量,并同时支出哪些分支被执行,哪些分支没有被执行。这项指标也在任何情况都有效。异常处理不考虑在分支范围内。

在这阶段,测验职员主要开展的是职能测验,为了给测量检验职员工作提供有利,大家创设了四个阳台:

      在有调试信息的情况下,分支点可以被映射到源码中的每一行,并且被高亮表示。
      红色钻石:无覆盖,没有分支被执行。
      黄色钻石:部分覆盖,部分分支被执行。
      绿色钻石:全覆盖,所有分支被执行。

Compass,测量检验管理平台,测量检验人士在这里平台能够立即明白本人的工作意况,举例本周的职分有啥样?各类自动化测量检验的实市场价格况怎样等等。CAS,测验自动化平台,测验人士能够依照须要手动地去接触试行自动化测验用例,并拿走详尽的告知。Click,测量试验工具平台,测量检验职员在全路测量检验周期中必然会用到精彩纷呈标工具,而在 Click 中测量试验职员能够很迅猛地找到并应用本人要求的工具。

➢ Cyclomatic Complexity:Jacoco为每个非抽象方法计算圈复杂度,并也会计算每个类,包,组的复杂度。根据McCabe1996的定义,圈复杂度可以理解为覆盖所有的可能情况最少使用的测试用例数。这项参数也在任何情况下有效。

回归测量试验

➢ Lines:该项指数在有调试信息的情况下计算。

在回归测量试验中,持续集成依然会接二连三开展,何况经过在中期对测量检验用例施行已经实行的深入分析,那时候测验用例的品质已经收获了加强。测验自动化的执行成效应该会更明显。

      因为每一行代码可能会产生若干条字节码指令,所以我们用三种不同状态表示行覆盖率
      红色背景:无覆盖,该行的所有指令均无执行。
      黄色背景:部分覆盖,该行部分指令被执行。
      绿色背景:全覆盖,该行所有指令被执行。

性情测验

➢ Methods:每一个非抽象方法都至少有一条指令。若一个方法至少被执行了一条指令,就认为它被执行过。因为JaCoco直接对字节码进行操作,所以有些方法没有在源码显示(比如某些构造方法和由编译器自动生成的方法)也会被计入在内。

咱俩提供了二种属性测验方法,场景轻巧的性质测验,测验职员能够经过质量测验平台自助的形成品质测验;而对于场景复杂的特性测量试验,测量检验职员能够在质量测验平新竹申请正常品质测量检验,由正规的品质测验人士完毕品质测量检验。

➢ Classes:每个类中只要有一个方法被执行,这个类就被认定为被执行。同5一样,有些没有在源码声明的方法被执行,也认定该类被执行。

监察预先警报

Jacoco 原理

出品上线的时候,我们都是如临深渊,为了能赶紧尽快地发现发表后的主题素材,及时飞速地定位难题,大家付出了督查预先警示平台,在那之中囊括日志预先警示,质量预先警示,机器预先警告以致报表监控。

参考资料:

Java 覆盖率总括平台为何要做代码覆盖率

  1. 浅谈代码覆盖率
  2. Jacoco的原理
  3. Java代码覆盖率工具JaCoCo原理篇

前方大家介绍酒店方今的成色保险体系,那么大家恐怕会专心到,在一切测量检验周期内会发生大量的测量试验用例,单元测量试验用例、API 测量检验用例、UI 测量试验用例、Job 测验用例、效能测量试验用例等等。


那么就面前遇到着二个主题材料:如何量化这几个测验用例的材料,怎么着衡量测量试验的完整度和有效性?


意料之中市,大家想到了 覆盖率,覆盖率表示的是测量检验必要和测量检验用例的推行进程,是胸襟测量试验完整性的三个手段,是测量检验有效性的三个心胸,覆盖率有二种评测方法:依靠需要的覆盖率和 依附代码 的覆盖率。

好了,废话不多说,咱们直奔主题,大家只要按照操作步骤执行就可以

依照要求的覆盖率

Jacoco搜聚焦成测量试验代码覆盖率

听别人说供给的覆盖率比较的直观,被测系统风度翩翩共有稍许功能,大家编辑的测验用例,测量检验了稍稍效果与利益,一览理解,所以平时大家测量试验最多应用的是基于须求覆盖的方法,可是依据须求覆盖的方法非常大程度上正视于要求文书档案的完整性,测量试验职员的希图测验用例的品位,覆盖的完整度差距如故极大的。

何以是合二为意气风发测验?
  • 计划专门的事业

    • 下载jacoco.zip包
  • 第一步:将下载下来的zip包与汤姆cat服务放在风流倜傥台机器上

  • 第二步:在[yourTomcatPath]/bin/catalina.sh增加Jacoco插件,指令如下

     JAVA_OPTS="-javaagent:[yourPath/]jacocoagent.jar=includes=com.companyName.*,output=tcpserver,port=8044,address=100.44.44.144 -Xverify:none"
    

    Tip:添加插件之前,须将的Tomcat服务停掉之后再添加,添加完之后,再启动Tomcat服务

    参数说明:
       1. yourPath是放jacocoagent.jar文件的目录路径;那么`jacocoagent.jar`这个`jar`包的路径就是在准备工作里下载下来的`zip`包,解压之后的`lib`目录下,如:'/jacoco-0.7.9/lib/jacocoagent.jar'
       2. includes是指要收集哪些类(注意不要光写包名,最后要写.*),不写的话默认是*,会收集应用服务上所有的类,包括服务器和其他中间件的类,一般要过滤(当然如果你愿意写*也完全没有问题,如:`includes=com.*` or `includes=*`);
       3. output有4个值,分别是file,tcpserver,tcpclient,mbean,默认是file。使用file的方式只有在停掉应用服务的时候才能产生覆盖率文件,而使用tcpserver的方式可以在不停止应用服务的情况下下载覆盖率文件,后面会介绍如何使用dump方法来得到覆盖率文件。
       4. address是IP地址,IP就是Tomcat服务器的机器的IP,至于是写`服务器本机的IP`还是写`127.0.0.1`要看情况
           1) 如果是在Tomcat服务器上执行`ant dump`的话,就直接写`address=127.0.0.1`
           2) 如果执行 `ant dump` 不是在Tomcat服务器上执行的,就得写服务器本机的IP(切记)
       5. port 是端口(端口比较随便,找个能用的端口就行,直接我为什么将端口写成`8044`,我的想法是`BUG 死死`与`8044`挺配的,所以就用它作为端口号了)
    (`address` 和 `port` 是使用 tcpserver 方式需要的 2 个参数,也是执行ant dump方法必须要用到的。)
       6. `-Xverify:none`:这个参数是防止启动主程序异常才加的(非强制,可以不加)
    

图片 1

启动Tomcat服务之后,ps一下,如果在Tomcat服务中有jacocoagent这个服务的话
那么恭喜你,你成功了!!!
  • 其三步:获取报告ant dump(也是就上文中提到的,非常提醒:这里运用ant一声令下,和你的代码工程应用什么编写翻译工具编写翻译的未有一些涉嫌,不要混淆卡塔尔
    build.xml文件内容如下
<?xml version="1.0" ?>
<project name="Jacoco" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">   
    <property name="jacocoantPath" value="[yourPath/]jacocoant.jar"/>
    <property name="integrationJacocoexecPath" value="./jacoco-integration.exec"/>

    <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
      <classpath path="${jacocoantPath}" />
    </taskdef>

    <target name="dump">
        <jacoco:dump address="100.44.44.144" port="8044" reset="true" destfile="${integrationJacocoexecPath}" append="false"/>
    </target>
</project>

`.exec`:二进制文件,Jacoco就是根据这个文件生成最终的报告
`destfile`:是指生成的覆盖率文件路径

Tip:
build.xml 只需修改三个点,就可以直接拿去用
第一个修改点:补全`jacocoant.jar`路径。(那么`jacocoant.jar`在哪?对于这个问题,或许会有疑问,当然,如果细心的小伙伴就会很轻易的发现`jacocoant.jar`的位置,其实也就在准备工作中所下载的`zip`包里面,与`jacocoagent.jar`在同级目录`lib`文件夹下)
第二个修改点:修改IP地址(IP须与`catalina.sh`中添加的一致)
第三个修改点:修改端口号(与IP一样,端口号须与`catalina.sh`中添加的一致)

Frequently Asked Questions:
虽然得到了集成测试的覆盖率文件,但是需要应用服务器上的类文件才能产出相应的覆盖率报告,如果类文件是其他JVM编译的,产出的报告覆盖率是0%。
有2种方法可以得到覆盖率文件所需的class文件:
1. 将应用服务部署的包(ear或war或jar)包下载下来之后解压,即可得到对应的class文件;
2. 在前面做单元测试之后,可以将class文件打成一个zip包,然后上传到服务器,最后在需要的时候去服务器上取。

修改好了,那么我们来测试一下,终端进入build.xml所在的目录,执行:ant dump 或者 ant dump -buildfile [yourPath/]build.xml

图片 2

ant dump

成功之后,接下来就是Jenkins集成jacoco实现代码覆盖率,详见:Jenkins + Jacoco 持续集成代码覆盖率

是不是只有上面的这一种方式呢?当然不是!
第二种方式(不推荐):
JAVA_OPTS="-javaagent:[yourPath/]jacocoagent.jar=destfile=[storagePath/]jacoco.exec
同样是加载cataline.sh文件中,除了获取报告的方式上面的不一样之前,其余步骤都一样

获取报告:
功能测试或者接口自动化后,需要获取报告的话,需关闭Tomcat获取结果文件`jacoco.exec`,使用kill [PID],之后到你保存的路径下就能看到`jacoco.exec`文件(切记不要使用kill -9 [PID],否则不能生成结果)
不推荐这种方式的理由:如果使用这种方式的话,不好做持续集成,因为jenkins服务器基本上都是和部署代码的服务器分开的,所以要从远程服务器取结果的话还是选择上面的方式

Q:那现在可能又有同学会问,这个报告只能在`Jenkins`上面生成吗?
A:当然也可以在本地生成了,附上代码,如下 

搜索