前言
现如今大家越来越认识到质量前移的重要性。如果一开始就写出优质的、经过测试的代码,那么后面的测试阶段将会减少很多不必要的时间。如果开发人员迫于业务压力,一味追求项目开发进度,往往会容易形成大量的“烂代码”。一般的烂代码体现在逻辑混乱、复杂度高、易读性差、没有单元测试和缺乏必要的注释。如果把这样的“烂代码”编译交付测试团队,那么测试人员势必会发现很多低级缺陷,甚至连冒烟测试都无法通过,这样势必会浪费很多时间,延误测试进度。所以,回到开始,为何不一开始就是写出优质代码呢?
代码评审
我们都知道很多公司都在推行 DevOps
、推行测试前移,就是让测试人员尽早参与研发过程中来,有很多团队推行了测试人员参与代码评审流程,但是往往效果不是很理想,原因通常是由于测试人员代码能力有限,不熟悉业务代码逻辑,当然也就无法发现正确问题,这样也就而导致测试团队的代码评审变成了摆设。那么问题来了,有什么办法解决这种状况吗?如果测试人员在执行代码评审的时候可以借助一些代码扫描工具,然后针对这些扫描出的问题再进一步分析,这样轻易地可以发现一些真正代码问题。
SonarQube简介
在实际的项目中,我们一般使用的多种编程语言,那么我们需要针对多种编程语言的一种扫描工具。目前主流的是使用 SonarQube 代码质量分析平台。
SonarQube是一个开源的代码质量分析平台,便于管理代码的质量,可检查出项目代码的漏洞和潜在的逻辑问题。同时,它提供了丰富的插件,支持多种语言的检测, 如 Java、Python、Groovy、C#、C、C++等几十种编程语言的检测。
它主要的核心价值体现在如下几个方面:
- 检查代码是否遵循编程标准:如命名规范,编写的规范等。
- 检查设计存在的潜在缺陷:SonarQube通过插件Findbugs、Checkstyle等工具检测代码存在的缺陷。
- 检测代码的重复代码量:SonarQube可以展示项目中存在大量复制粘贴的代码。
- 检测代码中注释的程度:源码注释过多或者太少都不好,影响程序的可读可理解性。
- 检测代码中包、类之间的关系:分析类之间的关系是否合理,复杂度情况。
SonarQube平台由4个组件组成:
- 一个SonarQube服务器包含三个子进程(web服务(界面管理)、搜索服务、计算引擎服务(写入数据库))
- 一个SonarQube数据库配置SonarQube服务
- 多个SonarQube插件位于解压目录extensions\plugins目录
- 一个或者多个SonarQube Scanners 用于分析特定的项目
SonarQube主要工作流程:
- 开发人员使用开发工具(IDE)上传代码到 GitLab (源代码管理器);
- Jenkins(CI系统)SCM自动拉取代码到到编译服务器;
SonarScanners
扫描该代码检查质量,将分析结果推送到 SonarQube 平台,进而持久化数据库存储;- 开发&测试人员可以使用IDE插件 SonarLint 来同步 SonarQube 结果(java和js版本等)并可以实时在线分析分析
- 领导可以通过 Web 访问 SonarQube 质量平台,项目代码质量趋势一目了然
使用 SonarLint
SonarQube 除了搭配 Jenlins 持续扫描代码质量外,我们还可以在IDE中使用 SonarLint ,让开发在开发阶段就及早发现可能存在的代码问题。
演示环境
- Windows 10
- SonarQube 7.4
- Visual Studio Enterprise 2017
- SonarLint 4.8.0
- .NET Framework 4.6.1
安裝 SonarLint
VisualStudio
中 【工具】 - > 【扩展和更新】
选择 【联机】 - > 输入【SonarLint】- > 选择【SonarLint for Visual studio】下载
重启 IDE
连接 SonarQube Server
先打开我们本地的项目 打开【分析】 - > 【管理 SonarQube 连接】
按【Connect...】连接 SonarQube Server
输入 SonarQube Server 地址以及大家的用户名密码
连接上 SonarQube Server后,会出现目前 server 所有的项目,选择当前本地项目需要绑定的项目。
绑定后会从 server 上下载 该项目分析结果和规则到本机。
自动分析
SonarLint 可以自动在 IDE 上检查出目前 server 上分析出的问题。
点击左侧的小灯泡,SonarLint 会解释该规则检查的理由。
手动分析
SonarLint 可手动检查整个本地项目和当前的类
点击【分析】- > 【针对解决方案】or 【当前类】 SonarLint 会将所有的检查到的问题显示在IDE下方。