为了解决没有单元测试代码,也要出具代码覆盖率的报告,故想到利用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”
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里添加配置
注意:sonar.coverage.jacoco.xmlReportPaths的路径最好是绝对路径,我试过相对路径,覆盖率一直是0,也不报错。
4、最后在项目根目录运行:./gradlew jacocoTestReport sonarqube,执行代码分析和覆盖率上传,查看平台数据