java覆盖率检测-jacoco

一、Jacoco 简介

官网地址:https://www.jacoco.org/jacoco/trunk/index.html

 

二.在java maven项目pom.xml中配置jacoco需要的依赖包

参考官网: https://www.jacoco.org/jacoco/trunk/doc/maven.html

<1>dependency依赖部分

复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.1</version>
    <scope>test</scope>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.8</version>
</dependency>
复制代码

<2>plugin插件部分

复制代码
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
                <configuration>
                    <skipTests>false</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <configuration>
                    <skip>false</skip>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.8</version>
                <configuration>
                    <skip>false</skip>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <configuration>
                            <outputDirectory>${basedir}/target/coverage-reports</outputDirectory>
                        </configuration>
                        <id>report</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
复制代码

 

 

三、Jenkins集成jacoco

1、安装JaCoCo插件

  • jenkins->系统管理->管理插件

          在可用插件搜索Jacoco,搜索到安装即可

  •  然后,在job的build步骤中的Execute shell 配置jacoco的执行命令:
mvn clean package verify -Pjacoco
或者直接使用:
mvn clean package verify

如果不知道这命令的意思,可以参考maven的生命周期这一篇:https://www.cnblogs.com/pingguomang/p/18333107

  • 在构建后检测步骤中配置JaCoCo报告的路径。如果使用maven项目,通常jacoco的结果文件是会生成在target/site/jacoco目录下。

 2、在job中增加“构建后操作”,选择'Record JaCoCo coverage report' 

 

  3、修改JaCoCo coverage report配置

 或者例如:

 其他配置(指标)也可按照我们所需进行配置,此处选择默认即可,然后点击保存。

 

 4. 配置覆盖率错误的后果

增加任务后,出现覆盖率配置,这里的配置需要特别注意,如果配错无法找到对应文件时,执行的日志不会报错,但会导致覆盖率报告结果为0

 

Path to exec files:代码覆盖率统计文件位置,即.exec生成的文件路径
Path to class directories:classes文件位置,统计的源代码编译后的路径
Path to source directories :源码文件位置,统计的源代码路径
下面是设置覆盖率百分比的提醒阈值:
太阳表示覆盖率高于设置阈值,覆盖率报告里会橙色提醒
乌云表示覆盖率低于设置阈值,覆盖率报告里会橙色提醒

  5.配置完成执行构建,完成后即可看到覆盖率报告的结果

 具体参考步骤:

 构建结束后,会生成coverrage Report

 

 点击coverrage Report查看详情

 

 

四。JaCoCo Coverage Report 各项指标说明

代码:

 

指标说明

  • Instructions
Jacoco 计算的最小单位就是字节码指令。指令覆盖率表明了在所有的指令中,
哪些被指令过以及哪些没有被执行。这项指数完全独立于源码格式并且在任何情况下有效,不需要类文件 的调试信息。
  • Branches
Jacoco 对所有的 ifswitch 指令计算了分支覆盖率。这项指标会统计所有的分支数
量,并同时支出哪些分支被执行,哪些分支没有被执行。这项指标也在任何情况都有效。异常处理不考虑在分支范围内。
如果class文件使用调试信息编译的话,产生的覆盖率可以映射到源码行并且高亮提示:
红色菱形:在这一行中没有分支被执行
黄色菱形:这一行的分支中只有一部分被执行
绿色菱形:这一行的所有分支都被执行
  • Complexity
Jacoco为每个非抽象方法计算圈复杂度,并也会计算每个类,包,组的复杂度。根据由McCabe1996圈复杂度的定义是,在(线性)组合中,计算在一个方法里面所有可能路径的最小数目。所以复杂度可以作为度量单元测试是否有完全覆盖所有场景的一个依据。复杂度即使是在没有调试信息的情况下也可以计算。圈复杂度V(G)的正式定义是基于方法的控制流图的有向图表示:
v(G) = E – N + 2
E是边界的数量,N是节点的数量。Jacoco 基于下面的方程来计算复杂度,B是分支的数量,D是决策点的数量:
v(G) = B – D + 1
基于每个分支的被覆盖情况,Jacoco也为每个方法计算覆盖和缺失的复杂度。缺失的复杂度同样表示测试案例没有完全覆盖到这个模块。注意Jacoco不将异常处理作为分支,try/catch块也同样不增加复杂度。
  •  Lines
该项指数在有调试信息的情况下计算。
红色背景:无覆盖,该行的所有指令均无执行。
黄色背景:部分覆盖,该行部分指令被执行。
绿色背景:全覆盖,该行所有指令被执行。
  • Methods
每一个非抽象方法都至少有一条指令。若一个方法至少被执行了一条指令,就认为它被执行过。因为 JaCoco
直接对字节码进行操作,所以有些方法没有在源码显示(比如某些构造方法和由编 译器自动生成的方法)也会被计入在内。
  • Classes
每个类中只要有一个方法被执行,这个类就被认定为被执行。同 5 一样,有些没有在源码声明的方法被执行,也认定该类被执行。

 

五,Jacoco report 转换为Cobertura report展示

1. 在job的build中增加一个Execute shell,把jacoco report转为cobertura report写入:

#convert JaCoCo xml report to Cobertura xml format
mkdir -p api/target/site/cobertura
/home1/userA/jenkins/ci/libs/cover2cover.py api/target/site/jacoco/jacoco.xml api/src/main/java > api/target/site/cobertura/coverage.xml
cover2cover.py文件的github开源的地址:https://github.com/rix0rrr/cover2cover

2.配置好cobertura的report报告:

 3.构建这个job

4. 就可以看到cobertura coverage report的报告了

 

 参考地址 :https://blog.csdn.net/weixin_38046028/article/details/126769231

posted @   苹果芒  阅读(148)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示