我正在开发一个项目,我们使用 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.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
}
我假设对于多模块项目的情况通常也应该这样做,特别是在你的情况下,因为 Minimal, Complete, and Verifiable example未提供您的多模块项目设置。
关于gradle - 如何将 JaCoCo Gradle 插件与 TestNG 和 JUnit 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41643727/