繁体   English   中英

随着迁移到Java 11,Jacoco代码覆盖率下降

[英]Jacoco code coverage dropped with migration to Java 11

我有几个使用Java 8构建的Gradle项目,并且在最近将它们转换为使用Java 11之后,Jacoco代码覆盖率报告的报告百分比比之前低得多。 在一个项目中,转换后立即将我的覆盖率从81%降至16%。

我尝试将Jacoco插件更新为0.8.3(具有JDK 11官方支持 ),Gradle更新为5.4,TestNG更新为6.14.3(不确定这是否有任何影响;认为最新版本不会受到影响)。 即使在这些变化之后,我上面提到的项目也有16%的覆盖率。 我手动检查了一些报告0%覆盖率的类,发现它们确实对它们进行了测试覆盖。

例如,我将此方法添加到我的一个类中:

public String helloWorld(){
        return "hello";
    }

然后我在测试中使用它:

@Test(groups = IntegrationTest.INTEGRATION_GROUP)
    public void testHelloWorld() {
        String helloWorld = authManager.helloWorld();
        assertEquals(helloWorld, "hello");
    }

覆盖范围报告为0:

在此输入图像描述

如果它有用,这是我的Jacoco Gradle设置。 我正在使用自定义插件来配置它们。

  class ManagedJacocoPlugin implements ManagedPlugin {
  @Override
  void apply(PluginManager pluginManager) {
    pluginManager.apply(JacocoPlugin.class)
  }

  @Override
  void configure(Project project, GradlePluginConfig pluginConfig) {
    def jacoco = project.extensions.getByName("jacoco")
    jacoco.toolVersion = "0.8.3"

    def jacocoTestReport = project.tasks.getByName('jacocoTestReport')
    jacocoTestReport.reports {
      xml.enabled false
      csv.enabled false
    }

    project.tasks.withType(Test).each { t ->
      t.jacoco {
        destinationFile = project.file("$project.buildDir/jacoco/test.exec")
      }
    }

    jacocoTestReport.dependsOn "integrationTest"
  }
}

就我能够收集的内容而言,鉴于我正在使用的工具版本,应该完全支持Java 11的Jacoco覆盖。 我在这里错过了什么?

以下是https://stackoverflow.com/help/mcve关于如何创建最小,完整和可验证示例的页面:

确保它完整

将问题中的代码复制到新文件或项目中,然后运行它。 如果它没有为你运行,那么它将无法为其他任何人运行。

但是谁知道你的例子中ManagedPlugin是什么?

但好吧,让我们尝试按照上述建议并使用我们所拥有的,假装我们有时间猜测,我们很幸运能够正确猜测。

添加了许多缺失部分之后,除ManagedPlugin之外的所有内容都将成为以下build.gradle

apply plugin: 'java'
apply plugin: 'jacoco'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'org.testng', name: 'testng', version: '6.14.3'
}

test {
    useTestNG() {
        includeGroups('unit')
    }
}

task integrationTest(type: Test, dependsOn: ['test']) {
    useTestNG() {
        includeGroups('integration')
    }
}


def jacoco = project.extensions.getByName("jacoco")
jacoco.toolVersion = "0.8.3"

def jacocoTestReport = project.tasks.getByName('jacocoTestReport')
jacocoTestReport.reports {
    xml.enabled false
    csv.enabled false
}

project.tasks.withType(Test).each { t ->
    t.jacoco {
        destinationFile = project.file("$project.buildDir/jacoco/test.exec")
    }
}

jacocoTestReport.dependsOn "integrationTest"

方法helloWorld进入src/main/Example.java

class Example {
    public String helloWorld() {
        return "hello";
    }
}

方法testHelloWorld进入src/test/ExampleTest.java

import org.testng.annotations.Test;
import static org.testng.Assert.*;

class ExampleTest {
    Example authManager = new Example();

    @Test(groups = "integration")
    public void testHelloWorld() {
        String helloWorld = authManager.helloWorld();
        assertEquals(helloWorld, "hello");
    }
}

使用Gralde 5.4和JDK 11.0.1执行gradle clean jacocoTestReport会生成以下报告

报告1

因此,我们可以得出结论,提供的示例肯定是不完整的。

让我们尝试猜测againg并添加到src/main/java/Example.java

    public void anotherMethod() {
    }

并进入src/test/java/ExampleTest.java

    @Test(groups = "unit")
    public void test() {
       new Example().anotherMethod();
    }

现在执行gradle clean jacocoTestReport会生成以下报告

报告2

似乎现在我们可以重现您的问题。

为什么不包括anotherMethod 让我们按照https://stackoverflow.com/help/mcve的另一个好建议:

分而治之。 如果您有少量代码,但问题的根源完全不清楚,请一次开始删除代码直到问题消失 - 然后再添加最后一部分。

这不仅适用于代码,也适用于版本的更改 - 让我们尝试将Gradle版本的更改从5.4更改为4.10.3并执行gradle clean jacocoTestReport生成

报告3

因此,我们可以得出结论, Gradle中的某些内容已被更改 让我们检查一下它的更改日志 - https://docs.gradle.org/5.0/release-notes.html包含一个非常有趣的声明:

JaCoCo插件现在可以使用构建缓存和并行测试执行

...使用代码覆盖率运行的任务被配置为在开始执行之前删除执行数据...

Task integrationTest删除任务test收集的数据。 我们试着不要使用同一个文件:

//project.tasks.withType(Test).each { t ->
//    t.jacoco {
//        destinationFile = project.file("$project.buildDir/jacoco/test.exec")
//    }
//}

jacocoTestReport.executionData(test)
jacocoTestReport.executionData(integrationTest)

现在即使使用Gradle 5.4也可以执行gradle clean jacocoTestReport

报告4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM