如何将JaCoCoGradle插件与TestNG和JUnit一起使用



我正在进行一个项目,我们正在使用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任务,使其执行使用了JaCoCoJava代理,但它忘记了更新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
}

我假设,对于多模块项目的情况,尤其是您的情况,也应该这样做,因为没有提供多模块项目设置的最小、完整和可验证的示例。

@Godin的第二个解决方案帮我解决了这个问题。但除此之外,我发现testNG无法被gradle识别,因为它与$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

最新更新