推荐一款 Java 代码覆盖率工具

文摘   2024-11-07 11:00   辽宁  

推荐一款 Java 代码覆盖率工具

什么是代码覆盖率?

代码覆盖率是指在软件测试过程中,测试用例执行源代码的比例。它反映了测试对代码的覆盖程度,即有多少代码被测试所执行。较高的代码覆盖率通常意味着更多的代码被测试过,有助于发现潜在的错误和问题,提高软件质量。

关注下方公众号,获取更多热点资讯

什么是 JaCoCo?

JaCoCo(Java Code Coverage)是一个用于 Java 项目的开源工具,可以测量 Java 程序的代码覆盖率,主要用于评估单元测试的效果。它提供了详细的执行报告,包括代码的哪些部分被测试覆盖,以及哪些没有被测试到。JaCoCo 支持多种构建工具,其中 Maven 是最常见的用途之一。

JaCoCo Maven 插件的安装与配置

在 Maven 项目中使用 JaCoCo 插件非常简单。您只需要将插件添加到项目的 pom.xml 文件中。以下是基本的配置示例:

 <build>
        <plugins>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.12</version>
                <configuration>
                    <!-- 排除特定的包或类 -->
                    <excludes>
                        <exclude>**/config/**</exclude>
                        <exclude>**/model/**</exclude>
                        <exclude>**/entity/**</exclude>
                        <exclude>**/dto/**</exclude>
                    </excludes>
                </configuration>
                <executions>
                    <!-- 准备阶段:初始化JaCoCo代理 -->
                    <execution>
                        <id>prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>

                    <!-- 单元测试报告生成 -->
                    <execution>
                        <id>report</id>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <phase>verify</phase>
                    </execution>

                    <!-- 添加测试覆盖率检查 -->
                    <execution>
                        <id>jacoco-check</id>
                        <goals>
                            <goal>check</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <rule implementation="org.jacoco.maven.RuleConfiguration">
                                    <element>BUNDLE</element>
                                    <limits>
                                        <limit implementation="org.jacoco.report.check.Limit">
                                            <counter>LINE</counter>
                                            <value>COVEREDRATIO</value>
                                            <minimum>0.80</minimum>
                                        </limit>
                                        <limit implementation="org.jacoco.report.check.Limit">
                                            <counter>BRANCH</counter>
                                            <value>COVEREDRATIO</value>
                                            <minimum>0.70</minimum>
                                        </limit>
                                        <limit implementation="org.jacoco.report.check.Limit">
                                            <counter>METHOD</counter>
                                            <value>COVEREDRATIO</value>
                                            <minimum>0.80</minimum>
                                        </limit>
                                    </limits>
                                </rule>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

详细说明

  • • version: 这里使用的是 JaCoCo 的最新稳定版本,你可以在 : https://www.jacoco.org/jacoco/trunk/doc/changes.html 页面找到最新的版本。

  • • prepare-agent: 这个目标会在测试运行之前准备 JaCoCo 的代理,监控代码执行。

  • • report: 此目标用于生成测试代码覆盖率报告。

执行测试并生成覆盖率报告

一旦您完成了 JaCoCo 插件的配置,就可以通过 Maven 命令执行单元测试并生成代码覆盖率报告。

mvn clean test
mvn jacoco:report

运行上述命令后,JaCoCo 将自动插入代理,并在测试完成后生成报告。报告通常生成在 target/site/jacoco/ 目录下,包括 HTML 格式、XML 格式和其他格式供后续分析。

JaCoCo 生成的报告将展示代码覆盖率的详细信息,通常包括以下几项:

  • • 指令覆盖率: 测试用例实际执行的代码行与总代码行的比例。

  • • 分支覆盖率: 测试用例针对条件分支的执行情况。

  • • 行覆盖率: 每个代码行被测试用例执行的次数。

下图是 HTML 格式的报告:

各列的含义:

  1. 1. Element:元素名称,通常是包名或类名。

  2. 2. Missed Instructions:未被覆盖的指令数。

  3. 3. Cov.:覆盖率(Coverage),表示已执行的指令占总指令的比例。

  4. 4. Missed Branches:未被覆盖的分支数。

  5. 5. Cov.:覆盖率(Coverage),表示已执行的分支占总分支的比例。

  6. 6. Missed Cxty:未被覆盖的上下文数。

  7. 7. Missed Lines:未被覆盖的行数。

  8. 8. Missed Methods:未被覆盖的方法数。

  9. 9. Missed Classes:未被覆盖的类数。

表格格式报告

验证覆盖率

mvn clean verify

如果覆盖率不够会提示异常

最佳实践:集成 JaCoCo 到持续集成 CI/CD 流程

集成 JaCoCo 将有助于确保每个版本都达到预期的代码覆盖率。以下是一个示例,展示如何在 Jenkins 中集成 JaCoCo。

  1. 1. 创建新项目: 在 Jenkins 中创建一个新项目,选择合适的项目类型(如自由风格项目)。

  2. 2. 配置构建步骤: 在构建配置中添加 Maven 构建步骤,命令为 clean test

  3. 3. 添加 JaCoCo 插件: 在 Jenkins 的插件管理中安装 JaCoCo 插件,并在构建后操作中配置报告生成路径。

示例 Jenkinsfile

如果您使用 Jenkins Pipeline,可以使用以下示例 Jenkinsfile 来集成 JaCoCo:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                script {
                    // 执行 Maven 构建
                    sh 'mvn clean install'
                }
            }
        }
        stage('Test') {
            steps {
                script {
                    // 执行测试并生成覆盖率报告
                    sh 'mvn test'
                }
            }
        }
        stage('Report') {
            steps {
                script {
                    // 生成 JaCoCo 报告
                    sh 'mvn jacoco:report'
                }
            }
        }
    }
    post {
        always {
            // 归档 JaCoCo 报告
            archiveArtifacts artifacts: 'target/site/jacoco/**/*'allowEmptyArchive: true
        }
    }
}

通过这种方式,构建过程将生成代码覆盖率报告,方便团队持续监控测试效果。


欢迎关注我的公众号“编程与架构”,原创技术文章第一时间推送。



编程与架构
专注于Java、大数据、AI以及开发运维技术的深入探索与分享。作为一名开源爱好者,致力于分享实战经验和前沿技术动态,帮助更多技术人提升技能。
 最新文章