Jacoco 显示错误的覆盖率检查结果
Jacoco Showing Wrong Coverage check Result
我已经通过 maven 在我的项目中配置了我的 Jacoco 插件。
这是我的 jacoco 配置
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
<configuration>
<excludes>
</exclude>**/some/package/SomeClass*</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>jacoco-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>CLASS</element>
<excludes>
<exclude>*Test</exclude>
</excludes>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>80%</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
我已经执行了测试,并显示摘要 Class 的覆盖率为 94%,我使用它的具体实现测试了这个摘要 class。
当我 运行 通过 maven build
我遇到以下错误
Rule violated for class
my.package.AbstractParser.1:
lines covered ratio is 0.00, but expected minimum is 0.80
我尝试在测试中使用虚拟实现来测试抽象 class,但我仍然遇到相同的错误
谁能告诉我我做错了什么。
编辑:
我找到了失败的原因
我写了一个内联地图初始化
return new HashMap<String, String>() {
{
put(input, "");
}
};
这部分的覆盖率显示为 0%。所以我的测试没有涵盖这部分。
可是我累了
final Map<String, String> defaultMap = new HashMap<>();
defaultMap.put(input, "");
return defaultMap;
构建过程甚至没有覆盖新代码。谁能解释一下为什么内联初始化会发生这种情况???
尝试将其添加到您的 gradle 构建中
android {
testOptions {
unitTests {
all {
jvmArgs '-noverify'
}
}
}
}
测试和覆盖率存在问题,因此您需要配置 jvmArgs
覆盖率检查设置,它可以在 IDE 本身中启用,但是当 运行 覆盖率在CI/maven/wherever应该配置在gradle
您的配置
<rules>
<rule>
<element>CLASS</element>
<excludes>
<exclude>*Test</exclude>
</excludes>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>80%</minimum>
</limit>
</limits>
</rule>
</rules>
表示每个class.
行覆盖率至少应达到80%
return new HashMap<String, String>() {
{
put(input, "");
}
};
声明 anonymous class,什么是 JaCoCo 报告中可见的顺便说一句 - 请参见下方屏幕截图中的第一个 table 行
鉴于
final Map<String, String> defaultMap = new HashMap<>();
defaultMap.put(input, "");
return defaultMap;
没有声明任何 class。
我已经通过 maven 在我的项目中配置了我的 Jacoco 插件。
这是我的 jacoco 配置
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
<configuration>
<excludes>
</exclude>**/some/package/SomeClass*</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>jacoco-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>CLASS</element>
<excludes>
<exclude>*Test</exclude>
</excludes>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>80%</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
我已经执行了测试,并显示摘要 Class 的覆盖率为 94%,我使用它的具体实现测试了这个摘要 class。
当我 运行 通过 maven build
我遇到以下错误
Rule violated for class my.package.AbstractParser.1: lines covered ratio is 0.00, but expected minimum is 0.80
我尝试在测试中使用虚拟实现来测试抽象 class,但我仍然遇到相同的错误
谁能告诉我我做错了什么。
编辑: 我找到了失败的原因
我写了一个内联地图初始化
return new HashMap<String, String>() {
{
put(input, "");
}
};
这部分的覆盖率显示为 0%。所以我的测试没有涵盖这部分。
可是我累了
final Map<String, String> defaultMap = new HashMap<>();
defaultMap.put(input, "");
return defaultMap;
构建过程甚至没有覆盖新代码。谁能解释一下为什么内联初始化会发生这种情况???
尝试将其添加到您的 gradle 构建中
android {
testOptions {
unitTests {
all {
jvmArgs '-noverify'
}
}
}
}
测试和覆盖率存在问题,因此您需要配置 jvmArgs
覆盖率检查设置,它可以在 IDE 本身中启用,但是当 运行 覆盖率在CI/maven/wherever应该配置在gradle
您的配置
<rules>
<rule>
<element>CLASS</element>
<excludes>
<exclude>*Test</exclude>
</excludes>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>80%</minimum>
</limit>
</limits>
</rule>
</rules>
表示每个class.
行覆盖率至少应达到80%return new HashMap<String, String>() {
{
put(input, "");
}
};
声明 anonymous class,什么是 JaCoCo 报告中可见的顺便说一句 - 请参见下方屏幕截图中的第一个 table 行
鉴于
final Map<String, String> defaultMap = new HashMap<>();
defaultMap.put(input, "");
return defaultMap;
没有声明任何 class。