当前位置: 首页 > 知识库问答 >
问题:

JaCoCo不适用于机器人电子测试

南宫才英
2023-03-14

我想在android项目中生成JUnit测试的代码覆盖率报告,所以我添加了JaCoCo gradle插件。这是我的项目级构建。gradle文件:

apply plugin: 'jacoco'

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0-beta6'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

subprojects { prj ->
    apply plugin: 'jacoco'

    jacoco {
        toolVersion '0.7.6.201602180812'
    }

    task jacocoReport(type: JacocoReport, dependsOn: 'testDebugUnitTest') {
        group = 'Reporting'
        description = 'Generate Jacoco coverage reports after running tests.'

        reports {
            xml {
                enabled = true
                destination "${prj.buildDir}/reports/jacoco/jacoco.xml"
            }
            html {
                enabled = true
                destination "${prj.buildDir}/reports/jacoco"
            }
        }

        classDirectories = fileTree(
                dir: 'build/intermediates/classes/debug',
                excludes: [
                        '**/R*.class',
                        '**/BuildConfig*',
                        '**/*$$*'
                ]
        )

        sourceDirectories = files('src/main/java')
        executionData = files('build/jacoco/testDebugUnitTest.exec')

        doFirst {
            files('build/intermediates/classes/debug').getFiles().each { file ->
                if (file.name.contains('$$')) {
                    file.renameTo(file.path.replace('$$', '$'))
                }
            }
        }
    }
}

jacoco {
    toolVersion '0.7.6.201602180812'
}

task jacocoFullReport(type: JacocoReport, group: 'Coverage reports') {
    group = 'Reporting'
    description = 'Generates an aggregate report from all subprojects'

    //noinspection GrUnresolvedAccess
    dependsOn(subprojects.jacocoReport)

    additionalSourceDirs = project.files(subprojects.jacocoReport.sourceDirectories)
    sourceDirectories = project.files(subprojects.jacocoReport.sourceDirectories)
    classDirectories = project.files(subprojects.jacocoReport.classDirectories)
    executionData = project.files(subprojects.jacocoReport.executionData)

    reports {
        xml {
            enabled = true
            destination "${buildDir}/reports/jacoco/full/jacoco.xml"
        }
        html {
            enabled = true
            destination "${buildDir}/reports/jacoco/full"
        }
    }

    doFirst {
        //noinspection GroovyAssignabilityCheck
        executionData = files(executionData.findAll { it.exists() })
    }
}

它通过运行<code>工作得很好/gradlew JacoFullReport。但不幸的是,使用<code>RobolectricTestRunner@RunWith注释的测试,或者使用mockitojunitestrunner运行的测试报告覆盖率很好。

任何帮助都将不胜感激来解决这个问题。

更新1:我注意到我应该使用RobolectricGradleTestRunner。但没有帮助。

共有3个答案

房新翰
2023-03-14

我遇到了同样的问题,但现在通过点击此链接为我解决了这个问题,

问题链接:https://github.com/robolectric/robolectric/issues/2230

此问题的解决方案在此处提及:

https://github . com/damp cake/Robolectric-jaco co-Sample/commit/f 9884 b 96 ba 5 e 456 cddb 3d 4d df 277065 bb 26 f1 d 3

寿嘉悦
2023-03-14

公认的答案有点过时了。这是我们刚刚实现的一个类似的修复。在模块(即app) build.gradle中添加:

apply plugin: 'jacoco'

tasks.withType(Test) {
    jacoco.includeNoLocationClasses = true
}

这确实需要JaCoCo 7.6,但您可能已经在使用它了。

工作室注意事项:

  1. 这只会修复CLI。如果使用JaCoCo从Studio运行覆盖率,则仍不会报告Robolectric覆盖率。默认的IntelliJ覆盖率运行器似乎工作正常
  2. 测试在Studio中断断续续地崩溃,除非我在Android JUnit中添加了-noverify-
秋博容
2023-03-14

可能的变通办法-https://github.com/jacoco/jacoco/pull/288是已知问题

或者将Jacoco版本降级为0.7.1.201405082137

更新

不再需要这种解决方法。您必须使用gradle版本2.13和jacoco版本0.7.6.201602180812

更新根build.gradle

buildscript {
    dependencies {
        classpath 'org.jacoco:org.jacoco.core:0.7.6.201602180812'
    }
}

task wrapper( type: Wrapper ) {
  gradleVersion = '2.13'
}

运行./gradlew包装器

更新项目build.gradle

apply plugin: 'jacoco'

android {
  testOptions {
    unitTests.all {
      jacoco {
        includeNoLocationClasses = true
      }
    }
  }
}
 类似资料:
  • 我模拟了spring boot服务类来测试catch块语句。我的示例测试用例如下: 聚 甲醛: 测试用例执行得很好,但它没有反映在Java代码覆盖率报告中。我的catch语句仍然显示它没有被测试覆盖。 可能的原因是什么? 参考 具有Jacoco代码覆盖率的PowerMockito https://www . igorkromin . net/index . PHP/2018/02/20/jacoc

  • 我正在尝试通过仪器测试运行浓缩咖啡(使用双意式浓缩咖啡)并通过Robolectric进行单元测试。到目前为止,我所拥有的主要基于甲板分级的例子。 注意:Gradle 1.10 我的目录结构如下,其中需要作为com.example.app运行。数据作为: 因此,当我运行时,我收到错误,无法识别中的浓缩咖啡导入。 当我运行 时,我收到错误,无法识别 中的 JUnit4 注释.java()。 如果我把任

  • 所以我管理域 britoanderson.com,我试图让ssl工作。我使用证书机器人为两个w制作证书。子域和主 britoanderson.com 域。我将云版本设置为“完整”加密模式。出于某种原因,SSL证书适用于 https://www.britoanderson.com/ 但不能用于网站拒绝打开 https://britoanderson.com/。 以下是我的nginx默认文件: 主域

  • 我通过GitHub将我的电报机器人部署到Heroku(我使用Webhook),机器人正在运行,但由于某种原因,它没有通过Webhook接收消息。 代码如下: 文件:

  • 1、接口声明 在调用接口时必须在https请求的header中携带"token"参数。 token是智齿客服接口开放平台全局唯一的接口调用凭据。 开发者在调用各业务接口时都需使用token,开发者需要进行妥善保存。token的存储至少要保留32个字符空间。token的有效期目前为24个小时,需定时刷新,或根据接口返回的token失效提示,进行重新获取。请求token接口,无论token是否存在,都

  • 我正在为我的项目设置Jacoco Gradle插件。该插件执行良好,并生成覆盖报告,但它不排除我将排除的包。 我想包含的类在com/xxx/ws/hn/**中,我想排除的类在com/xxx/ws/企业/**中。 这是我的Gradle脚本: 我有什么遗漏吗?我尝试过各种排除模式,包括“.”包的分隔符,而不是“/”,但似乎没有任何效果。任何帮助都将不胜感激。