前言
目前安卓下使用gradle
+jacoco
的方案大致有三種性置,前兩種為自動(dòng)鹏浅,第三種為手工屏歹。這里將對(duì)第三種方案下收集手工代碼覆蓋率中遇到的問題進(jìn)行描述和解決。
-
jacoco-android-gradle-plugin(舊)
僅支持到gradle5.0,似乎停止更新了
后有人基于此進(jìn)行維護(hù):jacoco-android-gradle-plugin(新)季希,支持到了gradle6.0幽纷。以后是否繼續(xù)維護(hù)還不好說(shuō)。 -
gradle-android-junit-jacoco-plugin
據(jù)說(shuō)目前都開始用這個(gè)進(jìn)行測(cè)試了峰尝? -
instrument 方式
靠譜的收集手工代碼覆蓋率的方案
PS:本文不會(huì)編寫完整的教程武学,僅針對(duì)instrument 方式教程中所存在問題進(jìn)行補(bǔ)充派诬。若還存在問題链沼,請(qǐng)留言或郵箱jin1ming@foxmail.com。
排坑
本次工作在MacOX 10.14.6
與Android Studio 4.0
下缆八。系統(tǒng)應(yīng)當(dāng)都兼容吧,AS版本只要不是太舊應(yīng)該就可以奈辰。
-
gradle版本
gradle插件版本和gradle版本,不能太高也不能太低吊趾,經(jīng)嘗試最適合的版本為:Android Gradle Plugin Version 3.5.0
Gradle Version 5.5修改建議在AS中File->Project Structure中進(jìn)行:
屏幕快照 2020-07-03 上午11.35.59.png 生成html報(bào)告的gradle腳本任務(wù)
陳年教程论泛,應(yīng)該是因?yàn)锳S更新后蛹屿,目錄發(fā)生了變化,需要自己修改下:
原:
task jacocoTestReport(type: JacocoReport) {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
reports {
xml.enabled = true
html.enabled = true
}
classDirectories = fileTree(
dir: './build/intermediates/app_classes/debug',
excludes: ['**/R*.class',
'**/*$InjectAdapter.class',
'**/*$ModuleAdapter.class',
'**/*$ViewInjector*.class'
])
sourceDirectories = files(coverageSourceDirs)
executionData = files("$buildDir/outputs/code-coverage/connected/coverage.ec")
doFirst {
new File("$buildDir/intermediates/app_classes/").eachFileRecurse { file ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}
將classes目錄修改后:
task jacocoTestReport(type: JacocoReport) {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
reports {
xml.enabled = true
html.enabled = true
}
classDirectories = fileTree(
dir: './build/intermediates/javac/debug/classes',
excludes: ['**/R*.class',
'**/*$InjectAdapter.class',
'**/*$ModuleAdapter.class',
'**/*$ViewInjector*.class'
])
sourceDirectories = files(coverageSourceDirs)
executionData = files("$buildDir/outputs/code-coverage/connected/coverage.ec")
doFirst {
new File("$buildDir/intermediates/javac/debug/classes/").eachFileRecurse { file ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}