通过执行JAR应用程序生成JaCoCo覆盖率报告

问题描述 投票:0回答:1

我正在开发控制台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已创建,但不包含任何承保范围信息。

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

UPD:我也尝试了另一种运行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文件中。

但是在生成错误消息jacocoTestReport的报告生成过程中(在Gradle任务[ant:jacocoReport] Execution data for class ... does not match.中,将跳过此数据。

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

java testing gradle code-coverage jacoco
1个回答
0
投票

最后,我已经找到了解决方案,所以我需要对此进行记录。

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

question中的更多详细信息。 answer帮助我解决了ant:jacocoReport错误。

此外,还需要修复CI / CD。我正在使用Azure DevOps管道。

管道中的我的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'
© www.soinside.com 2019 - 2024. All rights reserved.