Jacoco Code Coverage

来源:互联网 发布:i wrote python 编辑:程序博客网 时间:2024/05/19 04:27
近期因工作需要,需对代码覆盖率进行统计,所以这篇就当做对这段时间学习的总结。总得来说网上找到的资料都不系统,不适合新手理解和参考,下面我就以我一个小白的亲身体验,将我踩到的那些坑和遇到的那些疑惑记录下来(作为一名初学者,文章中可能会有错误或者理解偏差的地方,欢迎各位批评指正)
  • 针对Jacoco+Jenkins+SonarQube&SonarQube Scanner分为四个部分写的,建议阅读的顺序为:
    1. Jacoco Code Coverage ⇦
    2. Jenkins + Jacoco 持续集成代码覆盖率
    3. SonarQube & SonarQube Scanner
    4. Jenkins + SonarQube & SonarQube Scanner

代码覆盖率工具调研信息如下:

  • 市场上主要代码覆盖率工具:
    • Emma
    • Cobertura
    • Jacoco
    • Clover(商用)

具体见下表:

工具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,antJenkins集成生成html报告,直接与hudson集成,展示报告,无趋势图无法与hudson集成有集成的插件,美观的报告,有趋势图报告实时性默认关闭,可以动态从jvm dump出数据可以不关闭服务器默认是在关闭服务器时才写结果维护状态持续更新中停止维护停止维护

Tip:Jacoco也是Emma团队开发的



JaCoCo Java Code Coverage Library

Jacoco是一个开源的覆盖率工具。Jacoco可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用Java Agent技术监控Java程序。很多第三方的工具提供了对Jacoco的集成,如sonar、Jenkins、IDEA.

Java Counters

Jacoco包含了多种尺度的覆盖率计数器,包含指令级(Instructions,C0 coverage),分支(Branches,C1 coverage)、圈复杂度(Cyclomatic Complexity)、行(Lines)、方法(Non-abstract Methods)、类(Classes)。

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

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

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

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

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

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

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

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

Jacoco 原理

参考资料:

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


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

Jacoco收集集成测试代码覆盖率

什么是集成测试?
  • 准备工作
    • 下载jacoco.zip包
  • 第一步:将下载下来的zip包与Tomcat服务放在一台机器上
  • 第二步:在[yourTomcatPath]/bin/catalina.sh添加Jacoco插件,指令如下
原创粉丝点击