【手把手】SonarQube|【手把手】SonarQube 使用教程

SonarQube 是一款方便快捷的代码质量管理工具,如果还不知道如何部署的同学。
可以参考这篇文章<【手把手】Centos 安装部署 SonarQube>
部署好了,其实使用就很简单,所以这篇文章也不怎么正经,偶尔贴贴代码,那我们来唠唠如何使用,先来看看笔者某项目的分析结果:
【手把手】SonarQube|【手把手】SonarQube 使用教程
文章图片
sample.png

分析报告
Bugs 表示项目中隐藏的 "Bug" 个数。报告上的这事如果让测试同学知道的话,可能要兴奋好几天。
Vulnerabilities 表示可能存在安全风险的问题个数。总的说安全无绝对,只要比隔壁更安全就可以了。
Code Smells 表示我们通常所说的坏味道,想做优雅的程序员,就好好看看这一项吧。需求都完不成的同学,建议更应该看看,你就知道你需求完不成的原因了。
Coverage 表示单元测试覆盖率,即单元测试覆盖到了多少代码。 TDD 驱动的团队表示,我从来不看这一项,因为看或不看,它都是 100%
Duplications 表示代码重复率,此项也表示了大家工作量不饱和的程度,通常越闲重复率越高。每天把代码在项目中拷贝来拷贝去的同学,应该也不好意思说自己很忙吧。
上方 Passed 值 此值有 PassedFailed 两种情况,Passed 项目都差不多,然而 Failed 项目却各有各的失败,比如: 项目数据获取失败、此项目路径不含 .git 等版本管理文件、项目质量相较上次运行变的更差了。具体 Failed 原因,可点击项目名称,进入详情,在网页顶端查看。
右边时间 表示最近运行代码分析的时间。如果想快速显著提高代码质量,最好的方法就是一年运行一次分析,这样至少一年内都不会收到代码质量变差的警告了。
右边数字 表示项目代码行数。这个数字越大并不能100%表示系统越复杂,功能越全面,可能单纯表示你打字速度比较快。
打码的项目名 表示项目名,实际上,他是创建项目的时候填写的,你也可以随便写个名字。只要大家都知道是啥,它叫数据湖、数据库还是叫数据海,并没有多大区别。
点击项目名可以进入分析详情页面,这个倒比较重要。
如何生成分析报告
生成分析报告也非常简单。

  1. 点击右上角 + 号,选择“Create New Project” (创建新项目)
  2. 跳出的页面会让你填项目名和项目 key, 随便填就好,以自己认识和其他人看了不打你为标准。 填好后,选择 "set up" 继续
  3. 跳出的页面会让你填 token, 首次的话,生成一个就好,用户名也随便填,以别人认不出是你为标准。拷贝生成的 token, 点击继续 如果已经生成过 token, 且你很细心的记下了的话,也可以选择使用已有 token, 直接复制,点击继续
  4. 接下来这一步根据你项目的主要语言不同,各有不同,按需选择就好。跟随提示操作就好。 需要注意的是,其他语言需要下载 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 项目的话,存在 testandroidTest 两个单元测试目录。
配置 找到 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|【手把手】SonarQube 使用教程】至此你应该能生成且看懂一份完整的 SonarQube 分析报告了,如果你想优化改变项目代码,就拿分析报告结果打队友的脸吧。
如果你就想装个逼,到这里就可以了,截几个图,用 PS 修改下评级啥的,放进 PPT 里吧。
正儿八经的技术问题,欢迎留言交流。

    推荐阅读