为了解决没有单元测试代码,也要出具代码覆盖率的报告,故想到利用jacoco获取功能代码覆盖率,然后把该报告在sonarqube上展示即可达到目的。

Jacoco:

我按网上的教程(https://testerhome.com/topics/20718) 配置了自己公司的项目,其中躺了些坑,记录下:

原始附件: jacoco覆盖率文件.rar

1、按教程导入封装好的jacocohelper模块,然后把jacoco.gradle放入项目所在代码的那个模块里,非无脑的都是app目录下,由于我项目上的app模块只是个入口,真正的代码不在app模块下,所以按我项目,我放在了parking模块下,里面的路径也相应修改。

2、不同的不同的Gradle版本,编译后的classes目录也会不同,需要相应修改。

3、打包成apk包后,手动安装到手机里,执行后的coverage.ec文件为空,需要使用Tasks工具的install命令直接安装进手机里才行。

4、Android8.0以上的系统,coverage.ec文件为空,Android6.0的系统可以正常生成。

修改后的jacoco.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
apply plugin: 'jacoco'


//Java源码路径
def coverageSourceDirs = [
'../parking/src/main/java'
]


//Jacoco 版本
jacoco {
toolVersion = "0.8.5"
}


//以下配置均已配置好,原则上不需要有任何修改即可正常使用


//生成报告task
task jacocoTestReport(type: JacocoReport) {
group = "JacocoReport"
description = "Generate Jacoco coverage reports after running tests."
reports {
xml.enabled = true
html.enabled = true
}
getClassDirectories().setFrom(fileTree(
// classes目录按自己的项目的实际目录来,不同的Gradle版本,目录都会有所不同
dir: '../parking/build/intermediates/javac/debug/classes/',
excludes: ['**/R*.class',
'**/*$InjectAdapter.class',
'**/*$ModuleAdapter.class',
'**/*$ViewInjector*.class'
]))
getSourceDirectories().setFrom(files(coverageSourceDirs))
getExecutionData().setFrom(files("../parking/build/outputs/code-coverage/coverage.ec"))


doFirst {
new File("parking/build/intermediates/javac/debug/classes/").eachFileRecurse { file ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}


//初始化Jacoco Task
task jacocoInit(){
group = "JacocoReport"
doFirst{
File file = new File("./parking/build/outputs/code-coverage/")
if (!file.exists()){
file.mkdir();
}
}
}

这样就能生成jacoco的报告,我生成的目录为”../parking/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml”

E8D385C6-80FB-41C3-BF04-86D183BEC7C9

sonarqube:

1、之后就是要把jacoco的覆盖率报告上传给sonarqube,我部署的sonarqube是Docker安装,sonarqube版本为7.9(必须为7.9,7.9以前的插件官方已不支持下载,8.x的又强制规定扫描插件所用JAVA版本为JDK11以上,7.9的只给出警告不报错,所以使用7.9版本)

2、sonarqube就绪后,在项目代码所在模块的build.gradle里添加sonarqube依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.1"
}
}


apply plugin: "org.sonarqube"

3、sonarqube平台里新建项目,并在项目代码build.gradle里添加配置

996FF93E-4E51-4D6C-AC6D-CF166DFE9392

注意:sonar.coverage.jacoco.xmlReportPaths的路径最好是绝对路径,我试过相对路径,覆盖率一直是0,也不报错。

4、最后在项目根目录运行:./gradlew jacocoTestReport sonarqube,执行代码分析和覆盖率上传,查看平台数据

107E8E54-7ADD-4E74-8259-F9B27A80AD4F