gradle - 如何将 JaCoCo Gradle 插件与 TestNG 和 JUnit 一起使用?

标签 gradle junit testng jacoco multi-module

我正在开发一个项目,我们使用 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 JaCoCo 插件增强了 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 , 对于 testNG对于 test分别任务。虽然 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未提供您的多模块项目设置。

关于gradle - 如何将 JaCoCo Gradle 插件与 TestNG 和 JUnit 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41643727/

相关文章:

java - TestNG 中的 RunListener 等价物

android - 在模拟器SDK 22上运行时发生错误android.content.res.Resources $ NotFoundException:资源ID#0x7f07006c

android - 自动将 Beta Android 应用发布到 Google Play 商店

gradle - 如何根据现有插件向子项目添加插件?

android - 如何编辑Gradle以使用Recyclerview

java - 如何在测试用例中执行 try block 语句?

maven - 如何将参数传递给maven测试

java - TestNG 电子邮件报告 - PKIX 路径构建异常

java - 通过 Jenkins + ANT + Android 在没有 Junit 的情况下使用 Emma

java - 如何通过编程方式将所有 testng 可通过电子邮件发送的报告合并为单个报告