【手把手】SonarQube 使用教程

SonarQube 是一款方便快捷的代码质量管理工具,如果还不知道如何部署的同学。

可以参考这篇文章<【手把手】Centos 安装部署 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 分析报告了,如果你想优化改变项目代码,就拿分析报告结果打队友的脸吧。

如果你就想装个逼,到这里就可以了,截几个图,用 PS 修改下评级啥的,放进 PPT 里吧。

正儿八经的技术问题,欢迎留言交流。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容