首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jacoco:对于报表生成,必须在运行时使用相同的类文件

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

Stack Overflow用户
提问于 2015-11-04 09:13:54
回答 5查看 23.3K关注 0票数 20

我一直在从事一个android项目,并使用来做unitTests。

当我运行gradle jacocoTestReport时,它将显示

代码语言:javascript
运行
复制
[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中的静态方法。

代码语言:javascript
运行
复制
@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如下所示

代码语言:javascript
运行
复制
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
    }

}

我仍然可以毫无歪曲地看到报道。

但如何消除这种警告呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-11-11 18:20:08

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

您是设置不同的JAVA版本还是使用不同的级别(使用不同的JAVA)?当您看到关于xxx/yyy/zzz类的执行数据的警告/错误消息不匹配时,您可能得到了部分覆盖率,这意味着它将反映0%的覆盖率。

若要解决以下问题:

代码语言:javascript
运行
复制
[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“或"gradle integrationTest”或"gradle someKindOfnonUnitTest“(在Tomcat等外部容器后面)和使用jacocoTestReport任务使用jacoco生成覆盖率报告时,JAVA版本是相同的。

或如果上面的内容没有帮助,

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

前任:

代码语言:javascript
运行
复制
gradle clean build 
gradle ...some..nonUnitTestTask

然后

代码语言:javascript
运行
复制
gradle jacocoTestReport -x test -x testClasses -x compileJava -x classes
票数 18
EN

Stack Overflow用户

发布于 2018-06-05 18:37:04

当我尝试独立于我的jacocoTestReport任务运行test任务时,我遇到了这个问题--不是不同的test版本,只是陈旧的类。

解决办法之一是确保您得到一个新的构建和一个新的测试运行:

代码语言:javascript
运行
复制
$ gradle clean && gradle test && gradle jacocoTestReport

另一种方法是创建一个按顺序运行testjacocoTestReport的复合任务。在你的build.gradle

代码语言:javascript
运行
复制
task coverage {
  dependsOn 'test'
  dependsOn 'jacocoTestReport'
  tasks.findByName('jacocoTestReport').mustRunAfter('test')
}

我是JaCoCo的新手,我觉得这应该更容易一些,但这对我来说是有效的。

票数 2
EN

Stack Overflow用户

发布于 2020-01-19 13:32:48

如果您使用的是IntelliJ + Maven,请尝试如下

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33517805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档