2015-03-18 147 views
21

我试图生成Jacoco代码覆盖率报告。 我已经使用AndroidTestCase为我的测试类。Jacoco代码覆盖在Android Studio中

我一直在使用testCoverageEnabled真实,使用默认的Android -Studio默认jacoco, ./gradlew connectedCheck或createDebugCoverageReport 创建全成的百分比/失败测试案例,但没有覆盖报告发现。

然后我尝试了jacoco {toolVersion“0.7.1.201405082137”}和任务jacocoTestReport(类型:JacocoReport,dependsOn:“testDebug”)。我试图用各种任务来改变dependsOn值。该报告显示0(零)测试覆盖率,这是不可能的,因为至少有一半的类都经过测试。

我跟随在过去几天的堆栈溢出的各种公认的答案。结果是消极的。

我gradle这个文件:

buildscript { 
    repositories { 
     mavenLocal() 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.0.0'   
    } 
} 

apply plugin: 'com.android.application' 
apply plugin: 'jacoco' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "test.gradle.com.myapplicationtestgradle" 
     minSdkVersion 21 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
    } 

    buildTypes { 
     release { 
      minifyEnabled false    
      proguardFiles getDefaultProguardFile(
      'proguard-android.txt'), 'proguard-rules.pro' 
     } 
     debug { 
      testCoverageEnabled true 
     } 
    } 

    jacoco { 
     version "0.7.1.201405082137" 
    } 

    packagingOptions { 
     exclude 'LICENSE.txt' 
    } 
} 


jacoco { 
    toolVersion "0.7.1.201405082137" 
} 

task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") { 
    group = "Reporting" 

    description = "Generate Jacoco coverage reports" 

    // exclude auto-generated classes and tests 
    def fileFilter = ['**/R.class', '**/R$*.class', 
    '**/BuildConfig.*', '**/Manifest*.*',   
    'android/**/*.*'] 
    def debugTree = fileTree(dir: 
    "${project.buildDir}/intermediates/classes/debug", 
    excludes: fileFilter) 
    def mainSrc = "${project.projectDir}/src/main/java" 

    sourceDirectories = files([mainSrc]) 
    classDirectories = files([debugTree]) 
    additionalSourceDirs = files([ 
      "${buildDir}/generated/source/buildConfig/debug", 
      "${buildDir}/generated/source/r/debug" 
    ]) 
    executionData = fileTree(dir: project.projectDir, includes: 
        ['**/*.exec', '**/*.ec']) 

    reports { 
     xml.enabled = true 
     xml.destination = "${buildDir}/jacocoTestReport.xml" 
     csv.enabled = false 
     html.enabled = true 
     html.destination = "${buildDir}/reports/jacoco" 
    } 
} 


dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('junit:junit:4.11') { 
     exclude module: 'hamcrest-core' 
    } 
} 

回答

12

我看你已经懂了工作,然而,有一个为获得单位执行测试数据更简单的方法。我最近也在研究这个,我实际上做了一个完整的写作earlier today

在我的情况下,我不想创建额外的Gradle任务,因为我希望将报告生成为现有工作流程的一部分。我也不想明确添加Jacoco插件,因为测试工具测试覆盖报告的Jacoco Ant任务是Google already dups

除了设置属性android.jacoco.versionbuildTypes.debug.testCoverageEnabled,添加以下到testDebug JVM参数以生成执行数据:

project.afterEvaluate { 
    def append = "append=true" 
    def destFile = "destfile=$buildDir/outputs/code-coverage/connected/coverage.ec" 
    testDebug.jvmArgs "-javaagent:$buildDir/intermediates/jacoco/jacocoagent.jar=$append,$destFile" 

    createDebugCoverageReport.dependsOn testDebug 
} 

此单元测试执行数据附加到由connectedAndroidTest产生的覆盖文件,所以你的报告既反映了仪器测试,也反映了单元测试,而不是单独的每个变体。

请注意,connectedAndroidTest会覆盖覆盖率文件,请在创建报告时考虑这一点。如果任务testDebug没有任何更改,并且您运行的是createDebugCoverageReport,则它只会反映您的仪器测试覆盖范围。因此,请对您的单元测试进行更改。 Linux命令touch在这里可能很有用,虽然我还没有尝试过。

+0

只是引用什么似乎是获得任何类型的覆盖报告生成的规范方法,请参阅[this](http://stackoverflow.com/q/23795595/269300)这样的问题 - 任何人谁在获取'createDebugCoverageReport'时遇到问题。 – 2015-03-19 20:11:33

+1

我已经看到了接受的答案。我认为。你对仪器测试和单元测试都是正确的。我确实需要看看(testDebug.jvmArgs)。非常感谢你解释一些有用的信息。 – user1365169 2015-03-20 15:29:28

+0

这似乎并没有为我合并这两份报告。它只包括来自android测试的覆盖,而不是单元测试。我使用多种口味,但是我相应地更改了'project.afterEvaluate'。任何想法? – 2015-04-09 07:58:18

1

我完全去除机器人工作室,Android SDK中,gradle这个。然后重新安装一切。今天我完全删除了android studio,android sdk,gradle。然后重新安装一切。之后,我只是在应用程序build.gradle内添加。

debug { 
    testCoverageEnabled true 
} 

然后我运行./gradlew connectedChec。一切都很完美。 Android工作室默认Jacoco对我来说工作得很好。我认为也可以创建一个jacocoTestReport Task,然后创建代码覆盖率。我不知道为什么gradle和android studio以前没有工作。

38

Gradle已经内置了对生成测试覆盖率报告的支持,我们不需要创建任何额外的配置或添加任何插件来生成测试覆盖率报告。基本上,我们需要做的唯一的事情就是设置testCoverageEnabled参数truebuild.gradle文件,如下所示:

android { 
    buildTypes { 
     debug { 
     testCoverageEnabled = true 
     } 
    } 
} 

接下来,我们可以从CLI执行以下摇篮任务:

./gradlew createDebugCoverageReport 

在Windows我们可以这样执行它:

gradlew.bat createDebugCoverageReport 

任务将分析/src/main/java/直接我们项目的代码ory和单元测试放在/src/androidTest/java/目录中。 执行此任务后,我们可以发现在模块的以下目录中的测试覆盖率报告:

/build/outputs/reports/coverage/debug/ 

当我们打开index.html文件,我们可以看到测试覆盖率,可以在网络上观看的可视化报表浏览器。

它看起来如下图所示。

enter image description here

我已经写在Android应用程序的测试覆盖率报告的文章,它前一段时间发表在我的博客。如果你有兴趣在该主题中,您可以在阅读:

http://blog.wittchen.biz.pl/test-coverage-report-for-android-application/

更新(单元测试覆盖率为Robolectric测试)

如果你想创建单元测试的测试覆盖率报告写有Robolectric并生成测试覆盖率报告与Jacoco特拉维斯CICodecov.io,请看看在新的北极勒在我的博客:

http://blog.wittchen.biz.pl/test-coverage-report-with-travis-ci-for-robolectric-tests-on-android/

+6

我看到的唯一问题是在Android Studio上使用JUnit时,/ src/androidTest/java不是默认值。/src/test/java是目录。任何线索如何覆盖该目录? – 2015-10-26 23:55:36

+0

在我的情况下,我在'/ src/androidTest/java'中进行了所有测试,测试覆盖率报告仍然正确生成。当您将所有测试放到'/ src/test/java'或部分测试(普通java)到一个目录和另一部分(android)到不同目录时,我没有检查它是如何工作的。 – 2015-10-27 09:24:34

+0

但我们必须了解android studio本身使用jacoco来生成测试报告。 – dsharew 2015-12-02 06:18:28

相关问题