为了账号安全,请及时绑定邮箱和手机立即绑定

Android 使用 jacoco 统计代码行覆盖率

标签:
Android

1. build.gradle

在项目的 build.gradle 中引入 jacoco core 依赖:

apply plugin: 'maven'buildscript {
    repositories {
        jcenter()
        google()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath "org.jacoco:org.jacoco.core:0.8.2"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

2. 新建 jacoco-report.gradle

在项目根目录新建一个 jacoco-report.gradle 文件,其中主要定义了一个 Gradle 任务:jacocoCoverageTestReport。如下:

apply plugin: 'jacoco'tasks.withType(Test) {
    jacoco.includeNoLocationClasses = true}

/**
 * buildTypes {
 *     debug {
 *         minifyEnabled false
 *     }
 *     coverageDebug {
 *         minifyEnabled false
 *         testCoverageEnabled true
 *     }
 * }
 */
task jacocoCoverageTestReport(type: JacocoReport, dependsOn: ['testCoverageDebugUnitTest', 'createCoverageDebugCoverageReport']) {
    reports {
        xml.enabled = true
        html.enabled = true
    }
    def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*']
    def coverageDebugTree = fileTree(dir: "$project.buildDir/intermediates/classes/coverageDebug", excludes: fileFilter)
    def mainSrc = "$project.projectDir/src/main/java"
    sourceDirectories = files([mainSrc])
    classDirectories = files([coverageDebugTree])
    executionData = fileTree(dir: project.buildDir, includes: [            'jacoco/testCoverageDebugUnitTest.exec', 'outputs/code-coverage/connected/*coverage.ec'
    ])
}

3. app/build.gradle

在 SDK/App module 对应的 build.gradle 中进行 jacoco 任务配置:

  • 引入 jacoco-report.gradle

  • 添加 coverageDebug BuildType。

如下:

apply plugin: 'com.android.library'apply from: '../jacoco-report.gradle'android {
    compileSdkVersion project.androidCompileSdkVersion
    buildToolsVersion project.androidBuildToolsVersion

    defaultConfig {
        minSdkVersion project.androidMinSdkVersion
        targetSdkVersion project.androidTargetSdkVersion

        versionCode project.applicationVersionCode
        versionName project.applicationVersionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

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

    testOptions {
        unitTests.all {
            jvmArgs '-noverify'
        }
        unitTests {
            includeAndroidResources = true
        }

        unitTests.returnDefaultValues = true
    }

    lintOptions {
        abortOnError false
    }
}


dependencies {    // ...
    // other dependencies
    
    // for test.
    testImplementation 'junit:junit:4.12'

    // power mockito
    testImplementation 'org.mockito:mockito-core:2.8.9'
    testImplementation "org.powermock:powermock-api-mockito2:1.7.4"
    testImplementation "org.powermock:powermock-module-junit4:1.7.4"
    testImplementation "org.powermock:powermock-module-junit4-rule:1.7.4"
    testImplementation "org.powermock:powermock-classloading-xstream:1.7.4"}

3. 编写对应的测试用例

在对应 module 的 src/test/ 目录下编写对应的代码测试用例。

4. 运行 jacocoCoverageTestReport

https://img1.sycdn.imooc.com//5d2c182e00017c3507170353.jpg

Run Task jacocoCoverageTestReport

在 Android Studio 的 Gradle 任务窗格中,找到 project/module/Tasks/other/jacocoCoverageTestReport 这个任务,双击运行,即可生成代码行覆盖率报告。

5. 查看报告

打开 project/module/build/reports/jacoco/jacocoCoverageTestReport/html/index.html 文件,即可查看各个代码文件的行覆盖率。

https://img1.sycdn.imooc.com//5d2c183c00016c0b07220644.jpg

Report HTML file path

覆盖率报告 HTML 打开后一般如下:

https://img1.sycdn.imooc.com//5d2c18330001101d07170222.jpg



作者:牧秦丶
链接:https://www.jianshu.com/p/58393ca0d114


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消