android jacoco 对test 文件下单元测试覆盖率统计表


网上有很多对jacoco和android 结合的案例使用,但是针对的都是在androidTest目录下的单元测试,进行覆盖率统计,但是多数的单元测试都是放在放test的目录下。本文就是针对如何生成test目录下的单元测试覆盖率统计表进行说明。

1.在gradle配置jacoco

   android jacoco 对test 文件下单元测试覆盖率统计表

android jacoco 对test 文件下单元测试覆盖率统计表

以上两步配置完即可做androidTest目录下的单元测试覆盖率统计,要想生成test的覆盖率统计表接下的配置则是重点


android jacoco 对test 文件下单元测试覆盖率统计表

fileTree 就是配置需要生成单元测试覆盖率的文件,如果配置为 fileTree(dir:it)就是对整个工程的单元测试覆盖率进行统计,像我的app 用了mvp架构, 只是对presenter文件进行单元测试, 其他的fragment,activity等文件都没有进行单元测试,那么这样配置,管理人员需要一个一个找presenter文件, 而且生成的覆盖率统计也是相当的难看。所以直接presenter所在的包下, 在这个包下,可能也有许多文件我们不需要统计到单元测试覆盖率中, 那么exclude就可以配置忽略的文件, 比如内部类'**/*$*.*' Framgent类‘**/*Fragment*.*’,Activity类‘**/*Activity*.*’(所以在开发的时候,类的取名也很重要,方便批量省略文件) 。


以下是配置信息,方便复制粘贴

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

jacoco {
  toolVersion = "0.7.9" //声明jacoco的版本号
}
android {
  compileSdkVersion 25


  defaultConfig {
    applicationId "com.jv.benedict"
    minSdkVersion 16
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    ndk {
      abiFilters("armeabi", "armeabi-v7a", "x86", "mips")
    }
  }
  sourceSets {
    main {
      jniLibs.srcDir { 'libs' }
    }
  }


  lintOptions {
    abortOnError false
  }
  sourceSets {
    main {
      jniLibs.srcDirs = ['libs']
    }
  }
  buildTypes {
    debug {
      testCoverageEnabled = true //设置为true
    }
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  implementation fileTree(include: ['*.jar'], dir: 'libs')
  implementation 'com.android.support:appcompat-v7:25.4.0'
  implementation 'com.android.support.constraint:constraint-layout:1.0.2'
  testImplementation 'junit:junit:4.12'
  compile(name: 'ExCardSDK', ext: 'aar')
  compile(name: 'ExBankCardSDK', ext: 'aar')
  compile files('libs/livedetect.jar')
  androidTestImplementation 'com.android.support.test:runner:1.0.1'
  androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
  //okgo网路请求框架
  api 'com.lzy.net:okgo:3.0.4'
  //谷歌gson
  api 'com.google.code.gson:gson:2.8.1'
  //orhanobut/logger日志工具
  api 'com.orhanobut:logger:2.1.1'
  //butterknife添加
  compile 'com.jakewharton:butterknife:8.6.0'
  //butterknife添加
  annotationProcessor 'com.jakewharton:butterknife-compiler:8.6.0'
  //google官方依赖库(包括tablayout,FloatingActionButton,snackbar等控件)
  implementation 'com.android.support:design:25.4.0'
  //Glide依赖
  api 'com.github.bumptech.glide:glide:3.7.0'
  // 动态权限申
  api 'com.yanzhenjie:permission:1.1.2'
  //用OKhttp作为Glide的网络栈
  api 'com.github.bumptech.glide:okhttp3-integration:[email protected]'
  compile 'com.kaopiz:kprogresshud:1.0.2'
  testCompile 'org.mockito:mockito-core:1.10.19'
  testCompile 'org.hamcrest:hamcrest-library:1.1'
  testCompile 'org.hamcrest:hamcrest-all:1.3'
  testCompile 'org.mockito:mockito-all:1.10.19'
  testCompile 'org.json:json:20140107'
  // EventBus
  compile 'org.greenrobot:eventbus:3.1.1'
  compile 'com.xw.repo:fillblankview:[email protected]'
  implementation files('libs/BASE64.jar')
}

def coverageSourceDirs = ['src/main/java']
task jacocoTestReport(type: JacocoReport, dependsOn: "testDebugUnitTest") {
  group = "Reporting"

  description = "Generate Jacoco coverage reports"

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


  additionalSourceDirs = files(coverageSourceDirs)
  sourceDirectories = files(coverageSourceDirs)
  executionData = files('../app/build/jacoco/testDebugUnitTest.exec')

  reports {
    xml.enabled = true
    html.enabled = true
  }
  afterEvaluate {
    jacocoTestReport {
      classDirectories = files(classDirectories.files.collect {
        fileTree(dir:  "../app/build/intermediates/classes/debug/com/jv/benedict/ui",
            exclude: [
                      '**/*$*.*',
                     ])
      })
    }
  }
}

配置完成后, 执行命令gradle clean TestDebugUnitTest jacocoTestReport

即在'../app/build/reports/jacoco/jacocoTestReport/html'目录下生成关于test目录下的单元测试覆盖率报告

单元测试在test目录下

android jacoco 对test 文件下单元测试覆盖率统计表

生成的单元测试覆盖率报告(配置忽略的文件前)

android jacoco 对test 文件下单元测试覆盖率统计表

android jacoco 对test 文件下单元测试覆盖率统计表


配置忽略的文件('**/*Fragment*.*'),生成的报表

android jacoco 对test 文件下单元测试覆盖率统计表