Jacoco:对于报告生成,必须使用与运行时相同的 class 文件
Jacoco: For report generation the same class files must be used as at runtime
我一直在从事一个 android 项目并使用 roboletric 和 powermock 进行单元测试。
当我运行gradle jacocoTestReport
时,会显示
[ant:jacocoReport] Classes in bundle 'app' do no match with execution data. For report generation the same class files must be used as at runtime.
[ant:jacocoReport] Execution data for class com/my/app/MyClass does not match.
在 Myclass.java
中我使用 powermock 模拟静态方法的地方
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
@PrepareForTest(MyClass.class)
public class TheTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
@Test
public void test1() throws Exception {
PowerMockito.mockStatic(MyClass.class);
// do something
}
}
而build.gradle显示如下
apply plugin: 'jacoco'
def coverageSourceDirs = [
'../app/src/main/java'
]
task jacocoTestReport(type:JacocoReport, dependsOn: "testDebugUnitTest") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
classDirectories = fileTree(
dir: '../app/build/intermediates/classes/debug',
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/BuildConfig.*',
'**/Manifest*.*']
)
additionalSourceDirs = files(coverageSourceDirs)
sourceDirectories = files(coverageSourceDirs)
executionData = files('../app/build/jacoco/testDebugUnitTest.exec')
reports {
xml.enabled = true
html.enabled = true
}
}
我仍然可以看到没有失真的覆盖率报告。
但是如何去掉这样的警告呢?
当您使用 Java 版本 X 编译 classes 和 运行 测试 (jacoco) 时会发生这种情况,但是运行 jacocoTestReport 任务(在 Gradle 中),您正在使用另一个 Java 版本又名 Java Y。
您是否设置了不同的 JAVA 版本或使用不同的 Gradle(使用不同的 JAVA)?当您看到有关 class xxx/yyy/zzz 的执行数据不匹配的 warning/error 消息时,您可能会得到部分覆盖,这意味着它将反映 0% 的覆盖率。
解决以下问题:
[ant:jacocoReport] Classes in bundle 'app' do no match with execution data. For report generation the same class files must be used as at runtime.
[ant:jacocoReport] Execution data for class com/my/app/MyClass does not match.
确保:
- 你的 JAVA 版本是相同的,而 运行 "gradle clean build" 或 "gradle integrationTest" 或 "gradle someKindOfnonUnitTest" (在外部容器后面,如 Tomcat 等)和使用 jacocoTestReport 任务使用 jacoco 生成覆盖率报告。
或如果以上没有帮助,
- 同时 运行 "gradle jacocoTestReport"(假设您在工作区中拥有用于单元/非单元测试的有效 .exec 文件),传递一些如下所示的命令行开关。
例如:
gradle clean build
gradle ...some..nonUnitTestTask
然后
gradle jacocoTestReport -x test -x testClasses -x compileJava -x classes
我 运行 在尝试 运行 将 jacocoTestReport
任务与我的 test
任务分开时,我 运行 进入了这个 - 没有不同的 Java 版本,只是陈旧 类.
一个解决方法是确保您获得全新构建和全新测试运行:
$ gradle clean && gradle test && gradle jacocoTestReport
另一种是创建复合任务运行s test
和jacocoTestReport
的顺序。在你的 build.gradle
:
task coverage {
dependsOn 'test'
dependsOn 'jacocoTestReport'
tasks.findByName('jacocoTestReport').mustRunAfter('test')
}
我是 JaCoCo 的新手,我觉得这应该更容易,但这对我有用。
如果您使用的是 IntelliJ + Maven,试试这个
转到文件 --> 无效 Caches/Restart
有时,当您 运行 mvn jacoco:report
在 运行 之前 mvn clean install
或 mvn clean package
.
发生这种情况时,Jacoco 指的是旧版本的字节码,class 文件的字节码现已更改。那是我们再次构建项目的时候。
因此,在尝试 jacoco.
之前,请务必执行 package/install
请配置离线检测,以便 类 使用 PowerMockito 的单元测试覆盖率应反映如下
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>default-instrument</id>
<goals>
<goal>instrument</goal>
</goals>
</execution>
<execution>
<id>default-restore-instrumented-classes</id>
<goals>
<goal>restore-instrumented-classes</goal>
</goals>
</execution>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
我一直在从事一个 android 项目并使用 roboletric 和 powermock 进行单元测试。
当我运行gradle jacocoTestReport
时,会显示
[ant:jacocoReport] Classes in bundle 'app' do no match with execution data. For report generation the same class files must be used as at runtime.
[ant:jacocoReport] Execution data for class com/my/app/MyClass does not match.
在 Myclass.java
中我使用 powermock 模拟静态方法的地方@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
@PrepareForTest(MyClass.class)
public class TheTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
@Test
public void test1() throws Exception {
PowerMockito.mockStatic(MyClass.class);
// do something
}
}
而build.gradle显示如下
apply plugin: 'jacoco'
def coverageSourceDirs = [
'../app/src/main/java'
]
task jacocoTestReport(type:JacocoReport, dependsOn: "testDebugUnitTest") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
classDirectories = fileTree(
dir: '../app/build/intermediates/classes/debug',
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/BuildConfig.*',
'**/Manifest*.*']
)
additionalSourceDirs = files(coverageSourceDirs)
sourceDirectories = files(coverageSourceDirs)
executionData = files('../app/build/jacoco/testDebugUnitTest.exec')
reports {
xml.enabled = true
html.enabled = true
}
}
我仍然可以看到没有失真的覆盖率报告。
但是如何去掉这样的警告呢?
当您使用 Java 版本 X 编译 classes 和 运行 测试 (jacoco) 时会发生这种情况,但是运行 jacocoTestReport 任务(在 Gradle 中),您正在使用另一个 Java 版本又名 Java Y。
您是否设置了不同的 JAVA 版本或使用不同的 Gradle(使用不同的 JAVA)?当您看到有关 class xxx/yyy/zzz 的执行数据不匹配的 warning/error 消息时,您可能会得到部分覆盖,这意味着它将反映 0% 的覆盖率。
解决以下问题:
[ant:jacocoReport] Classes in bundle 'app' do no match with execution data. For report generation the same class files must be used as at runtime.
[ant:jacocoReport] Execution data for class com/my/app/MyClass does not match.
确保:
- 你的 JAVA 版本是相同的,而 运行 "gradle clean build" 或 "gradle integrationTest" 或 "gradle someKindOfnonUnitTest" (在外部容器后面,如 Tomcat 等)和使用 jacocoTestReport 任务使用 jacoco 生成覆盖率报告。
或如果以上没有帮助,
- 同时 运行 "gradle jacocoTestReport"(假设您在工作区中拥有用于单元/非单元测试的有效 .exec 文件),传递一些如下所示的命令行开关。
例如:
gradle clean build
gradle ...some..nonUnitTestTask
然后
gradle jacocoTestReport -x test -x testClasses -x compileJava -x classes
我 运行 在尝试 运行 将 jacocoTestReport
任务与我的 test
任务分开时,我 运行 进入了这个 - 没有不同的 Java 版本,只是陈旧 类.
一个解决方法是确保您获得全新构建和全新测试运行:
$ gradle clean && gradle test && gradle jacocoTestReport
另一种是创建复合任务运行s test
和jacocoTestReport
的顺序。在你的 build.gradle
:
task coverage {
dependsOn 'test'
dependsOn 'jacocoTestReport'
tasks.findByName('jacocoTestReport').mustRunAfter('test')
}
我是 JaCoCo 的新手,我觉得这应该更容易,但这对我有用。
如果您使用的是 IntelliJ + Maven,试试这个
转到文件 --> 无效 Caches/Restart
有时,当您 运行 mvn jacoco:report
在 运行 之前 mvn clean install
或 mvn clean package
.
发生这种情况时,Jacoco 指的是旧版本的字节码,class 文件的字节码现已更改。那是我们再次构建项目的时候。
因此,在尝试 jacoco.
之前,请务必执行 package/install请配置离线检测,以便 类 使用 PowerMockito 的单元测试覆盖率应反映如下
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>default-instrument</id>
<goals>
<goal>instrument</goal>
</goals>
</execution>
<execution>
<id>default-restore-instrumented-classes</id>
<goals>
<goal>restore-instrumented-classes</goal>
</goals>
</execution>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>