【问题标题】:How to use JaCoCo Gradle Plugin with TestNG and JUnit?如何将 JaCoCo Gradle 插件与 TestNG 和 JUnit 一起使用?
【发布时间】:2017-05-29 08:43:36
【问题描述】:

我正在开发一个项目,我们使用 TestNG 和 JUnit 进行测试。

不幸的是,在编写 TestNG 测试时,JaCoCo 覆盖率报告中并未考虑它们。

我编写了一个testng.gradle 文件,我将其包含在每个build.gradle 文件中(这是一个多模块项目):

task testNG(type: Test) { useTestNG() }
test.dependsOn testNG

JUnit 和 TestNG 测试都以这种方式工作。

如果我这样写我的testng.gradle

test {
    useTestNG()
}

JaCoCo 工作正常,但显然只有 TestNG 测试被执行。

我该如何解决?这是 Gradle 的 JaCoCo 插件中的错误吗?

【问题讨论】:

    标签: gradle junit testng jacoco multi-module


    【解决方案1】:

    似乎Gradle JaCoCo Plugin增强了testNG任务,使其执行使用JaCoCo Java agent,但忘记更新jacocoTestReport任务,使得该任务不使用testNG任务的执行结果.不知道这是一个错误还是故意的,但下面提供了解决方案。

    证明这一点

    文件src/main/java/Example.java:

    public class Example {
      public void junit() {
        System.out.println("JUnit");
      }
    
      public void testng() {
        System.out.println("TestNG");
      }
    }
    

    文件src/test/java/ExampleJUnitTest.java:

    import org.junit.Test;
    
    public class ExampleJUnitTest {
      @Test
      public void test() {
        new Example().junit();
      }
    }
    

    文件src/test/java/ExampleTestNGTest.java:

    import org.testng.annotations.Test;
    
    public class ExampleTestNGTest {
      @Test
      public void test() {
        new Example().testng();
      }
    }
    

    文件build.gradle:

    apply plugin: 'java'
    apply plugin: 'jacoco'
    
    repositories {
      mavenCentral()
    }
    
    dependencies {
      testCompile 'org.testng:testng:6.8.8'
      testCompile 'junit:junit:4.12'
    }
    
    task testNG(type: Test) {
      useTestNG()
    }
    
    test {
      dependsOn testNG
    }
    

    gradle clean test jacocoTestReport -d 执行后你会在日志中看到

    java ... -javaagent:.../jacocoagent.jar=destfile=build/jacoco/testNG.exec ...
    ...
    java ... -javaagent:.../jacocoagent.jar=destfile=build/jacoco/test.exec ...
    

    该目录 build/jacoco 包含两个文件 - testNG.exectest.exec,分别用于 testNGtest 任务。而 JaCoCo 报告仅显示 test 任务对 JUnit 的执行。

    解决这个问题

    指示任务testNG将执行数据写入与test相同的文件:

    task testNG(type: Test) {
      useTestNG()
      jacoco {
        destinationFile = file("$buildDir/jacoco/test.exec")
      }
    }
    

    指示任务jacocoTestReport 也使用testNG.exec 文件:

    jacocoTestReport {
      executionData testNG
    }
    

    我假设对于多模块项目的情况,尤其是您的情况,我假设应该这样做,因为您的多模块项目设置的Minimal, Complete, and Verifiable example 没有提供。

    【讨论】:

    • 我有同样的环境(testNG 和 jacoco),但这对我不起作用.. 我总是得到零代码覆盖率
    • 在 Gradle 6.6.1 上,第二个解决方案对我有用,但我还需要在 jacocoTestCoverageVerification 配置中添加 executionData testNG 以使验证在运行 gradle check 时停止失败。 jacocoTestReport 正在从 NG 测试中获取正确的代码覆盖率数据以构建报告,但验证任务仍在查看 jUnit 数据。我不确定如何让它同时从 jUnit 和 NG 测试中获取数据。
    【解决方案2】:

    @Godin 的第二个解决方案为我解决了这个问题。但补充一点,我发现 gradle 无法识别 testNG,因为它与 $buildDir/jacoco 下的正确 *.exec 文件不匹配。就我而言,它是testNg.exec,所以在我将这个块包含在我的子项目的 build.gradle 中之后它就起作用了:

    jacocoTestReport {
      executionData testNg
    }
    

    第一个解决方案对我不起作用

    task testNG(type: Test) {
      useTestNG()
      jacoco {
        destinationFile = file("$buildDir/jacoco/test.exec")
      }
    }
    

    我猜这是因为 testNG 正在覆盖从 JUnit 生成的整个文件 $buildDir/jacoco/test.exec

    【讨论】:

      猜你喜欢
      • 2017-11-09
      • 1970-01-01
      • 2014-03-28
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2018-10-23
      • 2021-11-24
      相关资源
      最近更新 更多