首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随着迁移到Java 11,Jacoco代码覆盖率下降

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

Stack Overflow用户
提问于 2019-04-24 21:44:28
回答 1查看 9.4K关注 0票数 5

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

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

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

代码语言:javascript
复制
public String helloWorld(){
        return "hello";
    }

然后,我在一个测试中使用了它:

代码语言:javascript
复制
@Test(groups = IntegrationTest.INTEGRATION_GROUP)
    public void testHelloWorld() {
        String helloWorld = authManager.helloWorld();
        assertEquals(helloWorld, "hello");
    }

报道的覆盖率为0:

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

代码语言:javascript
复制
  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"
  }
}

就我所能收集到的信息而言,考虑到我使用的工具的版本,Jacoco覆盖率应该完全支持Java 11。我在这里错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-30 21:26:34

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

确保它已经完成 将问题中的代码复制到一个新的文件或项目中,然后运行它。如果它不为你而跑,那么它就不会为别人而跑。

但是,谁知道您的示例中的ManagedPlugin是什么呢?

但是,好的,让我们试着遵循上面的建议,并使用我们所拥有的,假装我们有时间猜测,我们将幸运地正确地猜测。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
class Example {
    public String helloWorld() {
        return "hello";
    }
}

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

代码语言:javascript
复制
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");
    }
}

使用Gralde5.4和JDK11.0.1执行gradle clean jacocoTestReport生成以下报告

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

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

代码语言:javascript
复制
    public void anotherMethod() {
    }

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

代码语言:javascript
复制
    @Test(groups = "unit")
    public void test() {
       new Example().anotherMethod();
    }

现在,gradle clean jacocoTestReport的执行会产生以下报告

看来现在我们可以重现你的问题了。

为什么没有覆盖anotherMethod?让我们遵循来自https://stackoverflow.com/help/mcve的另一个很好的建议:

当您有少量代码,但问题的来源完全不清楚时,请开始一次删除一些代码,直到问题消失--然后再添加最后一部分。

这不仅适用于代码,也适用于版本的更改--让我们尝试将Gradle版本的更改从5.4反转回4.10.3,然后执行gradle clean jacocoTestReport produces

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

JaCoCo插件现在用于构建缓存和并行测试执行。 ..。具有代码覆盖率的任务被配置为在它们开始执行之前删除执行数据.

任务integrationTest删除由任务test收集的数据。让我们尝试不使用相同的文件:

代码语言:javascript
复制
//project.tasks.withType(Test).each { t ->
//    t.jacoco {
//        destinationFile = project.file("$project.buildDir/jacoco/test.exec")
//    }
//}

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

现在gradle clean jacocoTestReport的执行,即使用Gradle 5.4生成

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55838995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档