我正在进行一个项目,我们正在使用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.exec
和test.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
}
我假设,对于多模块项目的情况,尤其是您的情况,也应该这样做,因为没有提供多模块项目设置的最小、完整和可验证的示例。
@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
。