【问题标题】:Generating JaCoCo coverage report by executing JAR application通过执行 JAR 应用程序生成 JaCoCo 覆盖率报告
【发布时间】:2020-02-08 18:17:20
【问题描述】:

我正在开发一个控制台 Java 应用程序 (CLI),并尝试通过执行该程序、检查输出并将其与预期的结果进行比较来编写一些黑盒测试(使用 JUnit)。 一切正常,但我无法从 JaCoCo 获得代码覆盖率报告。

我的 build.gradle 文件中的 JaCoCo 和 JUnit 配置:

...

plugins {
    id 'jacoco'
}

...

dependencies {
    ...

    testCompile('org.junit.jupiter:junit-jupiter:5.5.2')
}

test {
    useJUnitPlatform()
}

jacoco {
    toolVersion = "0.8.5"
    reportsDir = file("$buildDir/reports")
}

jacocoTestReport {
    reports {
        xml.enabled true
        csv.enabled false
        xml.destination file("${buildDir}/coverage.xml")
    }

    getExecutionData().setFrom("$buildDir/jacoco/test.exec")
}

在测试中我这样做:

String command = "java -javaagent:libs/jacocoagent.jar=destfile=build/jacoco/test.exec -jar build/libs/myapp.jar";
Process process = Runtime.getRuntime().exec(command);
process.waitFor();

InputStream inputStream = process.getInputStream();

byte[] b = new byte[inputStream.available()];

String cliOutput = new String(b);

测试后执行文件build/jacoco/test.execbuild/coverage.xml 被创建,但不包含任何覆盖信息。

对于简单的单元测试,覆盖率正在生成,但它不包括如上所述执行整个程序的覆盖率。

统一更新: 我还尝试了另一种运行 JAR 的方法:

List<String> args = new ArrayList<>();

args.add("java");
args.add("-javaagent:libs/jacocoagent.jar=destfile=build/jacoco/test.exec");
args.add("-jar");
args.add(this.getCLiPath());
args.add(command);

ProcessBuilder builder = new ProcessBuilder(args.toArray(new String[0]));
Process process = builder.start();

但它没有帮助,同样的结果 - 执行 JAR 时没有覆盖。

UPD 2: 我刚刚发现执行数据正在收集到 .exec 文件中。

但在报告生成期间(在 Gradle 任务 jacocoTestReport 中)跳过了此数据,并显示错误消息 [ant:jacocoReport] Execution data for class ... does not match.

这是我的 jar 文件中的执行数据,但由于某种原因,它在报告中跳过了。

【问题讨论】:

    标签: java testing gradle code-coverage jacoco


    【解决方案1】:

    最后,我找到了解决方案,所以我需要记录一下。

    错误与 classID 有关。这是 JaCoCo docs-site - Class Ids 中详细描述的概念。在编译的应用程序中,类 ID 不同,JaCoCo 无法处理。

    更多详情请参阅question。这个answer 帮助我解决了ant:jacocoReport 错误。

    另外,我需要修复我的 CI/CD。我正在使用 Azure DevOps Pipelines。

    我在管道中的 Gradle 任务:

    - task: Gradle@2
        displayName: 'Gradle build, tests, code coverage report'
        inputs:
          gradleWrapperFile: 'gradlew'
          gradleOptions: '-Xmx3072m'
          javaHomeOption: 'JDKVersion'
          jdkVersionOption: '1.8'
          jdkArchitectureOption: 'x64'
          publishJUnitResults: true
          testResultsFiles: '**/TEST-*.xml'
          tasks: 'doJacocoOfflineInstrumentation buildCliJar test jacocoTestReport'
    

    【讨论】:

      猜你喜欢
      • 2018-09-09
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多