SonarQube 是一款方便快捷的代码质量管理工具,如果还不知道如何部署的同学。
可以参考这篇文章<【手把手】Centos 安装部署 SonarQube>
部署好了,其实使用就很简单,所以这篇文章也不怎么正经,偶尔贴贴代码,那我们来唠唠如何使用,先来看看笔者某项目的分析结果:
分析报告
Bugs
表示项目中隐藏的 "Bug" 个数。报告上的这事如果让测试同学知道的话,可能要兴奋好几天。
Vulnerabilities
表示可能存在安全风险的问题个数。总的说安全无绝对,只要比隔壁更安全就可以了。
Code Smells
表示我们通常所说的坏味道,想做优雅的程序员,就好好看看这一项吧。需求都完不成的同学,建议更应该看看,你就知道你需求完不成的原因了。
Coverage
表示单元测试覆盖率,即单元测试覆盖到了多少代码。 TDD 驱动的团队表示,我从来不看这一项,因为看或不看,它都是 100%
Duplications
表示代码重复率,此项也表示了大家工作量不饱和的程度,通常越闲重复率越高。每天把代码在项目中拷贝来拷贝去的同学,应该也不好意思说自己很忙吧。
上方 Passed 值
此值有 Passed
和 Failed
两种情况,Passed
项目都差不多,然而 Failed
项目却各有各的失败,比如: 项目数据获取失败、此项目路径不含 .git 等版本管理文件、项目质量相较上次运行变的更差了。具体 Failed
原因,可点击项目名称,进入详情,在网页顶端查看。
右边时间
表示最近运行代码分析的时间。如果想快速显著提高代码质量,最好的方法就是一年运行一次分析,这样至少一年内都不会收到代码质量变差的警告了。
右边数字
表示项目代码行数。这个数字越大并不能100%表示系统越复杂,功能越全面,可能单纯表示你打字速度比较快。
打码的项目名
表示项目名,实际上,他是创建项目的时候填写的,你也可以随便写个名字。只要大家都知道是啥,它叫数据湖、数据库还是叫数据海,并没有多大区别。
点击项目名可以进入分析详情页面,这个倒比较重要。
如何生成分析报告
生成分析报告也非常简单。
点击右上角 + 号,选择“Create New Project” (创建新项目)
跳出的页面会让你填项目名和项目 key, 随便填就好,以自己认识和其他人看了不打你为标准。 填好后,选择 "set up" 继续
跳出的页面会让你填 token, 首次的话,生成一个就好,用户名也随便填,以别人认不出是你为标准。拷贝生成的 token, 点击继续 如果已经生成过 token, 且你很细心的记下了的话,也可以选择使用已有 token, 直接复制,点击继续
接下来这一步根据你项目的主要语言不同,各有不同,按需选择就好。跟随提示操作就好。 需要注意的是,其他语言需要下载 SonarQube 客户端,再按提示执行对应命令。
Java 语言则支持 Maven 与 Gradle 两种方式,需要简单修改下对应的编译文件。
按上述操作,很容易就生成了分析报告,不过细心的你可能注意到,不管你写没写单元测试,此时分析报告的单元测试覆盖率都是 0%。
不急,我们接着搞。
单元测试覆盖率
单元测试覆盖率是 0, 主要原因是 SonarQube 本身自己不会去跑项目的单元测试,而是需要第三方跑单元测试,生成 .xml
等格式的单元测试报告,再运行命令时通过参数,告诉 SonarQube 单元测试报告的路径。
根据项目语言不同,生成单元测试的插件和方法也稍有不同,这里我们简单说几种生成单元测试报告的东西。
Python Coverage
首先安装 coverage:
pip install coverage -i https://pypi.tuna.tsinghua.edu.cn/simple
国外的朋友 -i https://pypi.tuna.tsinghua.edu.cn/simple
可以不加。
如果一切正常,你应该可以直接运行 coverage
命令:
coverage run -m unittest discover -s your_test_files_path/ -p '*_test.py'
上述命令建立在,你是用 unittest
写单元测试,且单元测试文件放在某个统一文件夹并以 _test
结尾的前提下。
若不是使用 unittest,可参考官网 ,
若单元测试文件分散在项目各处,可将 your_test_files_path 直接换成你的项目根路径。
若单元测试文件命名无规律,建议重构代码,且上述命令不会统计直接写在源代码模块下的单元测试类。
若不太正常,显示 command coverage not found
你可以通过 python(3) -m coverage
的方式运行 coverage
, 即(下同):
python3 -m coverage run -m unittest discover -s your_test_files_path/ -p '*_test.py'
再运行
coverage xml
此时,本地应该可以看到一个 coverage.xml
的测试报告文件,添加参数 sonar.python.coverage.reportPath=coverage.xml
指定测试报告路径,再重新运行 SonarQube 报告命令即可, 比如:
sonar-scanner -Dsonar.projectKey=xxx \
-Dsonar.sources=. \
-Dsonar.host.url=http://sonar.xxx.com \
-Dsonar.login=some_token \
-Dsonar.python.coverage.reportPath=coverage.xml
Gradle Android
以 Gradle 构建的 Android 项目为例, 普通 Gradle 项目配置还是比较简单的, Android 项目的话,存在 test
与 androidTest
两个单元测试目录。
配置
找到 project 级别 build.gradle
添加
plugins {
id "org.sonarqube" version "2.7"
}
sonarqube {
properties {
property "sonar.projectKey", "your_key"
property "sonar.projectName", "your_project_name"
property "sonar.host.url", "your_server_domain"
property "sonar.login", "your_provide_token"
property "sonar.sources", "src/main/java"
property "sonar.tests", "src/test/java, src/androidTest/java"
property "sonar.java.test.binaries", "build/intermediates/classes/debug"
property "sonar.jacoco.reportPaths", "build/outputs/code_coverage/debugAndroidTest/connected/*.ec"
property "sonar.coverage.jacoco.xmlReportPaths", "build/reports/coverage/debug/report.xml"
property "sonar.java.coveragePlugin", "jacoco"
}
}
再找到 module 级别 build.gradle
, 设置 testCoverageEnabled = true
, 如下:
buildTypes {
debug {
testCoverageEnabled = true
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
至此,配置完成了。 运行命令生成测试报告:
gradlew createDebugAndroidTestCoverageReport
此命令需要根据项目 flavour
情况进行修改,可使用 gradlew tasks
再搜索 CoverageReport
关键字查找。
检查 build/reports/coverage/debug/report.xml
目录下是否生成了对应的单元测试分析文件,若没有,可能单元测试跑失败了,可直接运行单元测试检查一下。
随后运行 SonarQube 分析命令上传分析结果:
gradlew sonarqube
若上述配置缺少必须参数,需要在命令中补齐。
结尾
至此你应该能生成且看懂一份完整的 SonarQube 分析报告了,如果你想优化改变项目代码,就拿分析报告结果打队友的脸吧。
如果你就想装个逼,到这里就可以了,截几个图,用 PS 修改下评级啥的,放进 PPT 里吧。
正儿八经的技术问题,欢迎留言交流。