You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot Gradle项目中,如何获取Mock Server上Karate API测试的Jacoco覆盖率?

解决Karate API测试Jacoco覆盖率为0的问题

核心原因是Karate测试通常会启动独立的Spring Boot应用进程,而Jacoco默认只跟踪当前测试进程的代码执行,不会自动捕获应用进程的覆盖率数据。单元测试在同一个JVM中运行,所以能正常统计。以下是具体解决方案:

步骤1:配置Gradle Jacoco插件及代理参数

在build.gradle中添加Jacoco配置,指定应用进程的覆盖率输出文件:

plugins {
    id 'org.springframework.boot' version '2.7.12'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    id 'java'
    id 'jacoco'
}

jacoco {
    toolVersion = "0.8.10" // 使用稳定版本
}

// 定义Jacoco代理参数,跟踪应用进程的代码执行
def jacocoAgentArgs = [
    "destfile=${buildDir}/jacoco/application.exec",
    "append=true",
    "includes=com.yourcompany.yourapp.**" // 替换为你的业务代码包路径
].join(',')

// 给Spring Boot启动任务添加Jacoco代理
tasks.named('bootRun') {
    jvmArgs "-javaagent:${jacocoAgentJar}=${jacocoAgentArgs}"
}

步骤2:配置Karate测试任务并关联应用启停

自定义Gradle任务,实现「启动应用→执行Karate测试→停止应用」的流程,确保测试期间应用进程被Jacoco跟踪:

// 自定义任务:执行Karate测试
task runKarateTests(type: JavaExec) {
    dependsOn bootRun
    mustRunAfter bootRun
    classpath = sourceSets.test.runtimeClasspath
    mainClass = 'com.intuit.karate.cli.Main'
    args = ['--test', 'classpath:features'] // 你的Karate feature文件路径
    
    // 测试完成后停止Spring Boot应用
    doLast {
        try {
            // 调用Actuator shutdown端点停止应用(需提前开启)
            new URL('http://localhost:8080/actuator/shutdown').openConnection().with {
                requestMethod = 'POST'
                connect()
                disconnect()
            }
        } catch (Exception e) {
            // 忽略连接异常,应用可能已自行停止
        }
    }
}

步骤3:合并单元测试与Karate测试的覆盖率数据

将单元测试生成的test.exec和应用进程生成的application.exec合并,生成统一的覆盖率报告:

// 合并覆盖率数据
task jacocoMerge(type: JacocoMerge) {
    executionData = files(
        "${buildDir}/jacoco/test.exec", // 单元测试覆盖率文件
        "${buildDir}/jacoco/application.exec" // 应用进程覆盖率文件
    )
    destinationFile = file("${buildDir}/jacoco/merged.exec")
}

// 生成合并后的覆盖率报告
task jacocoMergedReport(type: JacocoReport) {
    dependsOn jacocoMerge
    executionData = files("${buildDir}/jacoco/merged.exec")
    sourceSets sourceSets.main
    
    reports {
        html.required = true // 生成HTML报告,便于查看
        xml.required = true
        csv.required = false
    }
}

// 让check任务依赖合并报告,执行时自动生成
check.dependsOn jacocoMergedReport

步骤4:开启Spring Boot Actuator Shutdown端点

在application.properties中配置,让测试任务能停止应用:

management.endpoints.web.exposure.include=shutdown
management.endpoint.shutdown.enabled=true

额外检查项

  • 确认Karate测试实际调用了你的Spring Boot API,而非仅Mock Server:如果所有依赖都被Mock,应用业务代码未执行,覆盖率自然为0。
  • 验证Jacoco的includes参数是否正确覆盖业务代码包,避免包含测试代码或第三方库。
  • 确保应用进程正常停止:若应用强制终止,application.exec可能损坏,导致合并失败。

执行命令:

./gradlew runKarateTests jacocoMergedReport

完成后查看build/reports/jacoco/jacocoMergedReport/html/index.html即可看到包含Karate测试的覆盖率数据。

内容的提问来源于stack exchange,提问作者swapna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:35:24