[英]Jacoco code coverage dropped with migration to Java 11
我有几个使用Java 8构建的Gradle项目,并且在最近将它们转换为使用Java 11之后,Jacoco代码覆盖率报告的报告百分比比之前低得多。 在一个项目中,转换后立即将我的覆盖率从81%降至16%。
我尝试将Jacoco插件更新为0.8.3(具有JDK 11官方支持 ),Gradle更新为5.4,TestNG更新为6.14.3(不确定这是否有任何影响;认为最新版本不会受到影响)。 即使在这些变化之后,我上面提到的项目也有16%的覆盖率。 我手动检查了一些报告0%覆盖率的类,发现它们确实对它们进行了测试覆盖。
例如,我将此方法添加到我的一个类中:
public String helloWorld(){
return "hello";
}
然后我在测试中使用它:
@Test(groups = IntegrationTest.INTEGRATION_GROUP)
public void testHelloWorld() {
String helloWorld = authManager.helloWorld();
assertEquals(helloWorld, "hello");
}
覆盖范围报告为0:
如果它有用,这是我的Jacoco Gradle设置。 我正在使用自定义插件来配置它们。
class ManagedJacocoPlugin implements ManagedPlugin {
@Override
void apply(PluginManager pluginManager) {
pluginManager.apply(JacocoPlugin.class)
}
@Override
void configure(Project project, GradlePluginConfig pluginConfig) {
def jacoco = project.extensions.getByName("jacoco")
jacoco.toolVersion = "0.8.3"
def jacocoTestReport = project.tasks.getByName('jacocoTestReport')
jacocoTestReport.reports {
xml.enabled false
csv.enabled false
}
project.tasks.withType(Test).each { t ->
t.jacoco {
destinationFile = project.file("$project.buildDir/jacoco/test.exec")
}
}
jacocoTestReport.dependsOn "integrationTest"
}
}
就我能够收集的内容而言,鉴于我正在使用的工具版本,应该完全支持Java 11的Jacoco覆盖。 我在这里错过了什么?
以下是https://stackoverflow.com/help/mcve关于如何创建最小,完整和可验证示例的页面:
确保它完整
将问题中的代码复制到新文件或项目中,然后运行它。 如果它没有为你运行,那么它将无法为其他任何人运行。
但是谁知道你的例子中ManagedPlugin
是什么?
但好吧,让我们尝试按照上述建议并使用我们所拥有的,假装我们有时间猜测,我们很幸运能够正确猜测。
添加了许多缺失部分之后,除ManagedPlugin
之外的所有内容都将成为以下build.gradle
apply plugin: 'java'
apply plugin: 'jacoco'
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'org.testng', name: 'testng', version: '6.14.3'
}
test {
useTestNG() {
includeGroups('unit')
}
}
task integrationTest(type: Test, dependsOn: ['test']) {
useTestNG() {
includeGroups('integration')
}
}
def jacoco = project.extensions.getByName("jacoco")
jacoco.toolVersion = "0.8.3"
def jacocoTestReport = project.tasks.getByName('jacocoTestReport')
jacocoTestReport.reports {
xml.enabled false
csv.enabled false
}
project.tasks.withType(Test).each { t ->
t.jacoco {
destinationFile = project.file("$project.buildDir/jacoco/test.exec")
}
}
jacocoTestReport.dependsOn "integrationTest"
方法helloWorld
进入src/main/Example.java
class Example {
public String helloWorld() {
return "hello";
}
}
方法testHelloWorld
进入src/test/ExampleTest.java
import org.testng.annotations.Test;
import static org.testng.Assert.*;
class ExampleTest {
Example authManager = new Example();
@Test(groups = "integration")
public void testHelloWorld() {
String helloWorld = authManager.helloWorld();
assertEquals(helloWorld, "hello");
}
}
使用Gralde 5.4和JDK 11.0.1执行gradle clean jacocoTestReport
会生成以下报告
因此,我们可以得出结论,提供的示例肯定是不完整的。
让我们尝试猜测againg并添加到src/main/java/Example.java
public void anotherMethod() {
}
并进入src/test/java/ExampleTest.java
@Test(groups = "unit")
public void test() {
new Example().anotherMethod();
}
现在执行gradle clean jacocoTestReport
会生成以下报告
似乎现在我们可以重现您的问题。
为什么不包括anotherMethod
? 让我们按照https://stackoverflow.com/help/mcve的另一个好建议:
分而治之。 如果您有少量代码,但问题的根源完全不清楚,请一次开始删除代码直到问题消失 - 然后再添加最后一部分。
这不仅适用于代码,也适用于版本的更改 - 让我们尝试将Gradle版本的更改从5.4更改为4.10.3并执行gradle clean jacocoTestReport
生成
因此,我们可以得出结论, Gradle中的某些内容已被更改 。 让我们检查一下它的更改日志 - https://docs.gradle.org/5.0/release-notes.html包含一个非常有趣的声明:
JaCoCo插件现在可以使用构建缓存和并行测试执行
...使用代码覆盖率运行的任务被配置为在开始执行之前删除执行数据...
Task integrationTest
删除任务test
收集的数据。 我们试着不要使用同一个文件:
//project.tasks.withType(Test).each { t ->
// t.jacoco {
// destinationFile = project.file("$project.buildDir/jacoco/test.exec")
// }
//}
jacocoTestReport.executionData(test)
jacocoTestReport.executionData(integrationTest)
现在即使使用Gradle 5.4也可以执行gradle clean jacocoTestReport
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.