jacoco代码覆盖率浅析

1. jacoco简述

  1. 一个开源的覆盖率工具
  2. 很多第三方的工具提供了对JaCoCo的集成,如sonar、Jenkins等
  3. 目前只支持JDK 1.5及以上
  4. 官网地址:https://www.eclemma.org/jacoco/
  5. github地址:https://github.com/jacoco/jacoco

说明:

  • 为啥只能使用JDK 1.5及以上,因为jacoco使用的java代理,而java代理是jdk 1.5才有的
  • 背景:最早的时候是EMMA做的覆盖率工具,后来不维护了,就出现了EclEmma团队产出的jacoco(灵感来自EMMA)

2. jacoco覆盖率统计

  1. 行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
  2. 类覆盖率:度量计算class类文件是否被执行。
  3. 分支覆盖率:度量if和switch语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。
  4. 方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
  5. 指令覆盖:计数单元是单个java二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全 独立源码格式。
  6. 圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块。

3. jacoco使用方法

  1. Apache Ant方式 http://eclemma.org/jacoco/trunk/doc/ant.html
  2. 命令行方式 http://www.eclemma.org/jacoco/trunk/doc/agent.html
  3. Apache Maven方式 http://www.eclemma.org/jacoco/trunk/doc/maven.html
  4. Eclipse Plugin方式 http://www.eclemma.org/

4. jacoco原理

前面提到使用的是java代理
java代理的原理,就是java编译之后,生成.class文件,真正运行的是这些字节码文件,而java代理,就是对这个字节码文件进行修改后运行(生成一个新的文件,一般以$Proxy开头)

这样jacoco就可以利用这个原理,进行文件插桩,运行结束后,即可记录代码运行的位置,然后生产覆盖率报告
在这里插入图片描述

JaCoCo同时支持on-the-flyoffline的两种插桩模式

  • on-the-fly插桩:JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成
  • Offline模式:在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩 的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。

重点说明一下Apache Maven方式使用

1. 环境准备

  1. 依赖
<dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.9</version>
</dependency>
  1. 插件
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.9</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

2. 特殊配置 - 指定和剔除目录

<configuration>

    <!-- 指定覆盖目录 -->
    <includes>
        <include>com/**/*</include>
    </includes>

    <!-- 剔除覆盖目录 -->
    <excludes>
        <exclude>com/src/**/*</exclude>
    </excludes>

</configuration>

3. 特殊配置 - 指定输出目录

<configuration>

	<!-- 指定文件存储路径 -->
	<dataFile>target/jacoco.exec</dataFile>
	<outputDirectory>target/jacoco-temp</outputDirectory>

</configuration>

4. 特殊配置 - 覆盖规则

:这个调试过,没有生效,有哪位大神知道使用方式,给我留言,谢谢?

<configuration>
	<rules>
        <rule implementation="org.jacoco.maven.RuleConfiguration">
            <element>BUNDLE</element>
            <limits>
                <!-- 指定方法覆盖到80% -->
                <limit implementation="org.jacoco.report.check.Limit">
                    <counter>METHOD</counter>
                    <value>COVEREDRATIO</value>
                    <minimum>0.8</minimum>
                </limit>
                <!-- 指定指令覆盖到80% -->
                <limit implementation="org.jacoco.report.check.Limit">
                    <counter>INSTRUCTION</counter>
                    <value>COVEREDRATIO</value>
                    <minimum>0.80</minimum>
                </limit>
                <!-- 指定行覆盖到80% -->
                <limit implementation="org.jacoco.report.check.Limit">
                    <counter>LINE</counter>
                    <value>COVEREDRATIO</value>
                    <minimum>0.8</minimum>
                </limit>
                <!-- 指定类覆盖到100%,不能遗失任何类 -->
                <limit implementation="org.jacoco.report.check.Limit">
                    <counter>CLASS</counter>
                    <value>MISSEDCOUNT</value>
                    <maximum>0</maximum>
                </limit>
            </limits>
        </rule>
    </rules>
</configuration>

5. 启动

mvn clean install / mvn clean package

6. 覆盖率文件生成

在这里插入图片描述

7. 文件内容

在这里插入图片描述
单元测试未覆盖到和覆盖到到情况:
在这里插入图片描述在这里插入图片描述
说明

  • 绿色:行覆盖充分
  • 红色:未覆盖的行
  • 黄色菱形:分支部分覆盖
  • 绿色菱形:分支完全覆盖

附带一份测试代码
百度云盘链接: https://pan.baidu.com/s/1Ho6ilpm1wEmCQDfhA9PN4w
提取码: stmf

发布了39 篇原创文章 · 获赞 58 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43968234/article/details/100558646