【问题标题】:How to run Jacoco for Android using Gradle?如何使用 Gradle 运行 Jacoco for Android?
【发布时间】:2014-03-10 09:39:13
【问题描述】:

我正在尝试使用 Gradle 运行 Jacoco 以获取示例 Android 应用程序。我知道不能同时包含 Android 和 Java 插件,所以我认为应该在运行测试以生成 jacoco.exec 文件之前对 android 代码进行预检测。但是,我在运行我的 gradle 构建文件时收到了TargetInvocationException, caused by java.lang.StackOverflowError。错误是:

本机方法中的致命错误:-javaagent 处理失败

这是我的 build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.8.+'
    }
}
apply plugin: 'android'
apply plugin: 'jacoco'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.1"

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            res.srcDirs = ['res']
            java.srcDir file('src')
        }
    }
}

    sourceSets {
        unitTest {
            java.srcDir file('unitTest/src')
        }
    }

    configurations {
        unitTestCompile.extendsFrom runtime
        unitTestRuntime.extendsFrom unitTestCompile
        codeCoverage
    }

    repositories {
        mavenCentral()
    }

    dependencies {
        unitTestCompile files("$project.buildDir/classes/release")
        unitTestCompile 'junit:junit:4.11'
        unitTestCompile 'org.robolectric:robolectric:2.2'
        unitTestCompile 'com.google.android:android:4.0.1.2'
        codeCoverage 'org.jacoco:org.jacoco.agent:0.6.5.201403032054:runtime@jar'
    }

    tasks.whenTaskAdded { task ->
        if(task.name == 'unitTest'){
            task.jvmArgs "-javaagent:${configurations.codeCoverage.asPath}=destfile=${project.buildDir.path}/coverage-results/jacoco.exec,sessionid=HSServ,append=false",
                    '-Djacoco=true',
                    '-Xms128m',
                    '-Xmx512m',
                    '-XX:MaxPermSize=128m'
        }

    }
    task unitTest(type:Test, dependsOn: assemble){
        description = "run unit tests"
        testClassesDir = project.sourceSets.unitTest.output.classesDir
        classpath = project.sourceSets.unitTest.runtimeClasspath

        afterTest { desc, result ->
            println "Executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
        }
    }

build.dependsOn unitTest

这里有什么问题?

【问题讨论】:

    标签: android gradle code-coverage jacoco


    【解决方案1】:

    试用支持 Jacoco 测试的新 gradle 插件 0.10。

    dependencies {
        classpath 'com.android.tools.build:gradle:0.10.+'
    }
    

    来自 tools.android.com 页面:

    使用 Jacoco 测试代码覆盖率支持。使用testCoverageEnabled = true 在已测试的构建类型中启用。在build/reports/coverage 中生成的 HTML 和 XML 报告。配置 Jacoco 版本:

    android {
      jacoco {
        version = '0.6.2.201302030002'
      }
    }
    

    已知问题:这与使用 Dagger 不兼容。

    【讨论】:

    • 您可以使用此解决方法将 Jacoco 与 Dagger 或 ButterKnife 一起使用:chrisjenx.com/gradle-robolectric-jacoco-dagger
    • 我无法在我的 Android 项目中运行 jacoco 测试覆盖率。我可以在哪里阅读一些如何配置我的 build.gradle 文件的教程?顺便说一句,我的问题可能是我不能将“java”与 com.android.application 一起应用?
    猜你喜欢
    • 1970-01-01
    • 2018-02-24
    • 2015-01-16
    • 2019-11-24
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    相关资源
    最近更新 更多