随着向Java 11的迁移,Jacoco的代码覆盖率下降了

时间:2019-04-24 21:44:28

标签: java code-coverage jacoco java-11

我有几个使用Java 8构建的Gradle项目,最近将它们转换为使用Java 11之后,Jacoco代码覆盖率报告所报告的百分比大大低于以前。在一个项目中,过渡之后,我的覆盖率从81%下降到16%。

我尝试将Jacoco插件更新为0.8.3(官方JDK 11 support),将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:

enter image description here

如果有帮助,这是我的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的覆盖。我在这里想念什么?

1 个答案:

答案 0 :(得分:3)

这是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会产生以下报告

report 1

因此,我们可以得出结论,所提供的示例绝对不完整。

让我们尝试再次猜测并添加到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会产生以下报告

report 2

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

为什么anotherMethod不包括在内?让我们遵循https://stackoverflow.com/help/mcve的另一个很棒的建议:

  

分而治之。。如果代码量很少,但是问题的根源尚不清楚,请一次删除一点代码,直到问题消失为止–然后添加最后一个退回去。

它不仅适用于代码,还适用于版本更改-让我们尝试将对Gradle版本的更改从5.4撤回至4.10.3,并执行gradle clean jacocoTestReport产生

report 3

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

  

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

     

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

任务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

report 4