Android 使用 jacoco 統計代碼行覆寫率 無需安裝運行
- 前言
- 正文
- 1、專案 build.gradle
- 2、jacoco-report.gradle
- 3、 app/*module的build.gradle
- 4、 測驗用例
- 5、 運行 task jacocoTestReport
- 5、 查看報告
- 6、 小花招:快速提升代碼覆寫率
前言
jacoco是Java Code Coverage的縮寫,是Java代碼覆寫率統計的主流工具之一,關于jacoco的原理介紹,在網上有很多文章,感興趣的同學可以去找別的博客看看,這里不做贅述,
最近接到這個需求,需要提升代碼單測覆寫率并統計上傳,了解到的實作方式是jacoco+Squaretest插件,在網上查了不少的資料,不得不說網上大部分的資料都非常老了,gradle插件一般都是2.3的,導致很多類檔案路徑錯誤,浪費了我很多時間,就算有比較新的博文,也大都是需要安裝運行之后從手機存盤再提取相應的ec檔案來執行分析才能得出結果,我們這邊目標是有腳本直接可以執行獲取相應的檔案來統計并自動上傳,所以那種需要運行之后再提取相應的檔案決議不是很方便,而且這種方案在不同手機上可能還會帶來各種問題,于是,在我經過一番實踐后終于實作了無需運行只需執行gradle task便可得到覆寫率檔案,決定分享一下,為日后有需求的同學節省一些時間!
正文
請根據以下步驟細心耐心進行配置,中間如果出現任何錯誤都會影響到最后覆寫率檔案的生成!
1、專案 build.gradle
在專案的 build.gradle 中引入 jacoco core 依賴:
、、、
buildscript {
repositories {
、、、
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}
dependencies {
、、、
classpath 'com.android.tools.build:gradle:3.2.1' //可具體配置 本教程務必使用3.2以上
classpath "org.jacoco:org.jacoco.core:0.8.5"
}
}
、、、
2、jacoco-report.gradle
在專案根目錄新建一個 jacoco-report.gradle 檔案,其中主要定義了一個 Gradle 任務:jacocoCoverageTestReport,代碼如下:
apply plugin: 'jacoco'
tasks.withType(Test) {
jacoco.includeNoLocationClasses = true
}
ext {
getFileFilter = { ->
def jacocoSkipClasses = null
if (project.hasProperty('jacocoSkipClasses')) {
jacocoSkipClasses = project.property('jacocoSkipClasses')
}
//忽略類檔案配置
def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*$ViewInjector*.*']
if (jacocoSkipClasses != null) {
fileFilter.addAll(jacocoSkipClasses)
}
return fileFilter
}
}
task jacocoTestReport(type: JacocoReport, dependsOn: ['testCoverageDebugUnitTest', 'createCoverageDebugCoverageReport']) {
group = "Reporting"
description = "Generate Jacoco coverage reports"
reports {
xml {
enabled = true
xml.destination file("build/reports/jacoco/jacoco.xml")
}
html {
enabled = true
html.destination file("build/reports/jacoco")
}
}
def fileFilter = project.getFileFilter()
//檢測覆寫率的class所在目錄(以專案class所在目錄為準)
//gradle2.3 class所在目錄
def coverageDebugTree = fileTree(dir: "$project.buildDir/intermediates/classes/coverageDebug", excludes: fileFilter)
//gradle3.2 class所在目錄
def coverageDebugTreeNewGradle = fileTree(dir: "$project.buildDir/intermediates/javac/debug/compileDebugJavaWithJavac/classes", excludes: fileFilter)
def mainSrc = "$project.projectDir/src/main/java"
//設定需要檢測覆寫率的目錄
sourceDirectories = files([mainSrc])
//兼容gradle版本
classDirectories = files([coverageDebugTree, coverageDebugTreeNewGradle])
//以下路徑也需要檢查
executionData = fileTree(dir: project.buildDir, includes: [
'jacoco/testCoverageDebugUnitTest.exec', 'outputs/code-coverage/debugAndroidTest/connected/coverage.ec'
])
}
注意以上注釋的位置,每一個配置務必仔細檢查路徑是否正確且存在!
3、 app/*module的build.gradle
在你需要統計的 app或者某 module 對應的 build.gradle 中進行 jacoco 任務配置:
引入 上面新建的 jacoco-report.gradle;
添加 coverageDebug BuildType,
代碼如下:
apply plugin: 'com.android.library'
apply from: '../jacoco-report.gradle'
android {
、、、
defaultConfig {
、、、
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
}
lintOptions {
、、、
abortOnError false
}
buildTypes {
、、、
coverageDebug {
minifyEnabled false
testCoverageEnabled true
}
}
testOptions {
unitTests.all {
jvmArgs '-noverify'
}
unitTests {
includeAndroidResources = true
}
unitTests.returnDefaultValues = true
}
、、、
}
dependencies {
、、、
testImplementation 'junit:junit:4.12'
//單元測驗
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
testImplementation 'org.robolectric:robolectric:4.3.1'
testImplementation "org.robolectric:shadows-multidex:4.3"
testImplementation 'org.hamcrest:hamcrest-all:1.3'
// 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"
}
4、 測驗用例
在需要測驗的對應 module 的 src/test/ 目錄下撰寫對應的代碼測驗用例,建議使用 Squaretest插件生成,使用方式請自行搜索,基本沒什么坑,這里不再贅述,
5、 運行 task jacocoTestReport

在 Android Studio 的 Gradle 任務窗格中,找到 project/module/Tasks/reporting/jacocoTestReport 這個任務,雙擊運行,即可生成代碼行覆寫率報告,
5、 查看報告
打開 project/module/build/reports/jacoco/index.html檔案,即可查看各個代碼檔案的行覆寫率,

覆寫率報告用瀏覽器打開后一般如下:
6、 小花招:快速提升代碼覆寫率
根據覆寫率報告將覆寫率低的類忽略,具體可查看步驟2代碼的第一個注釋處
、、、
//忽略類檔案配置
def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*$ViewInjector*.*'
//繼續添加想要被忽略的低覆寫率的類
'**/ClassA.class','**/ClassB.class'、、、
]
、、、
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377135.html
標籤:其他
上一篇:ViewPager2的使用:基本使用、原始碼分析、多種切換影片
下一篇:記事本(一)
