android jacoco 对test 文件下单元测试覆盖率统计表
网上有很多对jacoco和android 结合的案例使用,但是针对的都是在androidTest目录下的单元测试,进行覆盖率统计,但是多数的单元测试都是放在放test的目录下。本文就是针对如何生成test目录下的单元测试覆盖率统计表进行说明。
1.在gradle配置jacoco
以上两步配置完即可做androidTest目录下的单元测试覆盖率统计,要想生成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目录下
生成的单元测试覆盖率报告(配置忽略的文件前)
配置忽略的文件('**/*Fragment*.*'),生成的报表