如何使用Gradle运行Jacoco for Android?

Dik*_*sha 2 android code-coverage gradle jacoco

我正在尝试使用Gradle运行Jacoco以获取示例Android应用程序.我知道Android和Java插件都不能包含在内,所以我相信在运行测试生成jacoco.exec文件之前,应该为android代码进行预检测.但是,我在运行gradle构建文件时遇到了由java.lang.StackOverflowError引起的TargetInvocationException.错误是:本机方法中的致命错误:-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
Run Code Online (Sandbox Code Playgroud)

这有什么不对?

tom*_*ozb 6

尝试使用Jacoco支持测试的新gradle插件0.10.

dependencies {
    classpath 'com.android.tools.build:gradle:0.10.+'
}
Run Code Online (Sandbox Code Playgroud)

从tools.android.com页面:

使用Jacoco测试代码覆盖率支持.在测试的Build Type中启用testCoverageEnabled = true.生成的HTML和XML报告build/reports/coverage.配置Jacoco版本:

android {
  jacoco {
    version = '0.6.2.201302030002'
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 您可以使用此解决方法将Jacoco与Dagger或ButterKnife一起使用:http://chrisjenx.com/gradle-robolectric-jacoco-dagger/ (3认同)