Jacoco:对于报告生成,必须使用与运行时相同的类文件

问题描述 投票:0回答:6

我一直在开发一个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.

我使用 powermock 来模拟 Myclass.java 中的静态方法

@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 android gradle powermock jacoco
6个回答
18
投票

当您使用 Java 版本 X 编译类并运行测试 (jacoco) 但运行 jacocoTestReport 任务(在 Gradle 中)时,会发生这种情况,您使用的是另一个 Java 版本,即 Java Y

您是否设置了不同的 JAVA 版本或使用不同的 Gradle(使用不同的 JAVA)?当您看到有关 xxx/yyy/zzz 类的执行数据不匹配的警告/错误消息时,您可能会获得部分覆盖率,这意味着它将反映 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.

确保:

  1. 在运行“gradle clean build”或“gradle IntegrationTest”或“gradle someKindOfnonUnitTest”(在 Tomcat 等外部容器后面)以及使用 jacocoTestReport 任务使用 jacoco 生成覆盖率报告时,您的 JAVA 版本是相同的。

OR如果上述方法没有帮助,

  1. 运行“gradle jacocoTestReport”时(假设您在工作区中拥有用于单元/非单元测试的有效 .exec 文件),请传递一些命令行开关,如下所示。

例如:

gradle clean build 
gradle ...some..nonUnitTestTask

然后

gradle jacocoTestReport -x test -x testClasses -x compileJava -x classes

2
投票

当我尝试将

jacocoTestReport
任务与我的
test
任务分开运行时,我遇到了这个问题——不是不同的 Java 版本,只是过时的类。

一个解决方法是确保您获得全新的构建和全新的测试运行:

$ gradle clean && gradle test && gradle jacocoTestReport

另一种方法是创建一个按顺序运行

test
jacocoTestReport
的复合任务。在你的
build.gradle
:

task coverage {
  dependsOn 'test'
  dependsOn 'jacocoTestReport'
  tasks.findByName('jacocoTestReport').mustRunAfter('test')
}

我是 JaCoCo 的新手,我觉得这应该更容易,但这对我有用。


2
投票

如果您使用 IntelliJ + Maven,请尝试这个

转到文件 --> 使缓存无效/重新启动


0
投票

有时,当您在运行

mvn jacoco:report
mvn clean install
之前运行
mvn clean package
时,会发生这种情况。

发生这种情况时,Jacoco 指的是旧版本的字节码,并且类文件的字节码现在已更改。那是我们再次构建项目的时候。

因此,在尝试 jacoco 之前,请务必先执行 package/install


0
投票

请配置离线检测,以便使用 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>

0
投票

我也有同样的问题

对我来说,我只是尝试了 mvn clean install 并且它有效。

mvn clean install
© www.soinside.com 2019 - 2024. All rights reserved.