测试人社区

代码质量管理平台实战| SonarQube 安装、配置及 JaCoCo、Maven 集成

代码质量管理平台实战| SonarQube 安装、配置及 JaCoCo、Maven 集成

迷途小码农 [霍格沃兹测试学院](javascript:void(0):wink: 6月12日

image

代码质量管理平台 SonarQube 实战,进阶学习文末加群。

一、SonarQube

1.1 简介

SonarQube 是一个用于代码质量管理的开源平台,用于管理源代码的质量。同时 SonarQube 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 SonarQube。此外, SonarQube 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。

官方网址:https://www.sonarqube.org/

1.2 使用范围

通过插件形式,可以支持包括 Java,C#,C/C++、PL/SQL、Cobol、JavaScrip、Groovy、Ruby 等二十五种编程语言的代码质量管理与检测,针对不同的编程语言其所提供的分析方式也有所不同:对于所有支持的编程语言,SonarQube 都提供源了代码的静态分析功能;对于某些特定的编程语言,SonarQube 提供了对编译后代码的静态分析功能。

SonarQube 支持多种客户端集成方式,包括但不限于 Scanner 客户端、Ant、Gradle、Maven、Jenkins、IDEA 插件等。比较常用的为 Gradle 和 Maven。

1.3 工作原理

SonarQube 并不是简单地将各种质量或覆盖率检测工具的结果(例如 CheckStyle、JaCoCo 等)直接展现给客户,而是通过不同的插件算法来对结果进行再加工,并最终以量化的方式来衡量代码质量,从而方便地对不同规模和种类的工程进行相应的代码质量管理,以便进行有针对性的代码修复或重构。

SonarQube 在进行代码质量管理时,会从以下的七个纬度对项目代码质量进行分析。

SonarQube 7Rules

1.4 扩展性

Sonar 实际上是一个 Web 系统,展现了静态代码扫描的结果,结果是可以自定义的,而真正实现代码扫描的是 Sonar Scanner 这个工具,另外同时支持多种语言的原理是它的扩展性,通过插件实现的,也就是 Java Jar 架包,可以在 Sonar 平台上在线安装或者离线安装。

二、SonarQube 安装、配置

2.1 前置条件

  1. 已安装 JDK1.8 环境
  2. 已安装 Maven(用于后期与 SonarQube、JaCoCo 的集成)
  3. 已安装 MySQ L数据库(Sonar 默认的数据库是自带 H2 数据库,是很小的嵌入式数据库引擎,这里的配置换成了 MySQL,为了方便通过数据库客户端进行数据查询)

2.2 配置工作

1.下载 SonarQube,地址为:

http://www.sonarqube.org/downloads/

2.配置数据库(下面的SQL是指定了schema为sonar,password为sonar,其中第四条SQL是localhost是因为MySQL安装在本地)

  mysql -u root -p

    mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; 
    mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
    mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
    mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
    mysql> FLUSH PRIVILEGES;

3.安装 SonarQube

I. 将下载的 sonar-3.7.zip 包解压至 Windows某个路径,如 D:\Tools\sonar(如是其他OS,请选择对应路径,如Linux的/usr/local/等)。

II. 修改 sonar.properties

在 /conf/sonar.properties 文件中,配置数据库设置(默认已经提供了各类数据库的支持这里使用 MySQL,因此取消 MySQL 模块的注释),同时因为端口冲突而改成端口为 11000。

     # User credentials.
    # Permissions to create tables, indices and triggers must be granted to JDBC user.
    # The schema must be created first.
    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar

    #----- Embedded Database (default)
    # H2 embedded database server listening port, defaults to 9092
    #sonar.embeddedDatabase.port=9092

    #----- MySQL 5.6 or greater
    # Only InnoDB storage engine is supported (not myISAM).
    # Only the bundled driver is supported. It can not be changed.
    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

    # TCP port for incoming HTTP connections. Default value is 9000.
    #sonar.web.port=9000
    sonar.web.port=11000

III.在 /bin/ 目录下,运行 /windows-x86-64/StartSonar.bat (因为本 demo 是在 win10 64位安装的,如果是 Linux 的话,运行 nohup bash sonar.sh start &

IV. 访问 http://localhost:11000,如果不是本机就输入 http://[remote IP]:11000,如果你看到下图所示即证明配置成功。

4.用 admin/admin(默认)进行登录,并安装汉化包

Chinese pack installation

Chinese pack restart

Chinese pack restart confirm

Well done!

三、Sonar Scanner 安装、配置

3.1 配置工作

  1. 下载Sonar Scanner,地址为:

https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

  1. 将下载的 sonar-scanner-cli-3.3.0.1492-windows.zip 包解压至 Windows 某个路径,如D:\Tools\sonar(如是其他OS,请选择对应路径,如Linux的/usr/local/等)

  2. 修改环境变量

新增变量:
SONAR_SCANNER_HOME = D:\Tools\sonar\sonar-scanner-3.3.0

修改Path变量:增添
%SONAR_SCANNER_HOME%\bin\

  1. 安装Sonar Scanner

I. 将下载的 sonar-3.7.zip 包解压至 Windows 某个路径,如 D:\Tools\sonar(如是其他 OS,请选择对应路径,如 Linux的/usr/local/ 等)。

II. 修改 sonnar-scanner.properties

在 /conf/sonar-scanner.properties 文件中,设置SonarQube服务器。

#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here

#----- Default SonarQube server
sonar.host.url=http://localhost:11000

III. 到你想检测的工程根目录下新建文件sonar-project.properties,文件内容如下?,文件中的参数配置,参考Sonar Analysis Parameters这篇文章。

   #这里的配置转自https://www.jianshu.com/p/e384595d0b14,并进行部分调整,如加进JACOCO参数

    # 指定SonarQube instance必须是唯一的
    sonar.projectKey=Guns
    # 设置SonarQube UI显示的名称 
    # PS:有人会问这里的名称是否可以是中文名称,我在网上搜索了好多资料都说是不可以的(至少我看到的资
    #料都是)后来自己尝试了一下,答案是可以写成中文的,但是要换一种方式,比如你想把项目名称命名为“测
    #试”,那么在这里就要写成“\u6d4b\u8bd5”,那么下面这个参数就应该这样写“sonar.projectName= 
    #\u6d4b\u8bd5”,说白了就是将中文转成Unicode
    sonar.projectName=Guns
    sonar.projectVersion=1.0
    sonar.language=java
    # 指定src和classes文件夹位置,当然也可以是全路径,如果是当前工程根目录下用“.”表示也可以,比如“sonar.sources=.”
    sonar.sources=src/main
    sonar.test=src/test
    sonar.java.binaries=target
    # 下面的这两个参数作用是相同的,因为有时我们需要指定某个文件夹或者忽略某个文件夹
    # sonar.inclusions=src1/**,src3/**
    # sonar.exclusions=src2/**,src4/**
    # 源码编码,默认是系统编码
    sonar.sourceEncoding=UTF-8
    # Set jacoco Configuration
    # 指定代码覆盖率工具
    sonar.core.codeCoveragePlugin=jacoco
    # 指定exec二进制文件存放路径
    #sonar.jacoco.reportPaths=[yourPath/]jacoco.exec
    #本demo之前设置的exec文件是在工程根目录下的target/coverage-reports下:
    sonar.jacoco.reportPaths=target/coverage-reports/jacoco-unit.exec
    # 以下属性可选择性加,当然也可以不加
    sonar.dynamicAnalysis=reuseReports
    sonar.jacoco.reportMissing.force.zero=false

3.2 运行

在命令行模式下,在工程的根目录下键入命令“sonar-scanner”,你会看到以下日志:

运行 sonar-scanner

接着,重新登录 SonarQube 平台,检测的结果已经在平台上展现出来

从上图你可以看出来,连单元测试覆盖率的统计也生成出来了,主要原因为在该maven项目之前已经集成了Jacoco插件(具体Maven与Jacoco的集成请参考我的另外一篇文章)。

四、Jacoco、Maven 与 SonarQube 的集成

4.1 前置条件

1.该项目为maven项目,并且Jacoco已经通过POM文件集成到项目中,具体步骤请参考我的另外一篇文章。

2.该集成方案其实还是首先通过maven package 命令去生成对应的覆盖率报告,然后通过sonar scanner直接使用该覆盖率报告并通过一定算法加工并展示到SonarQube的界面上去。

4.2 配置工作

1.在项目根目录的 sonar-project.properties 文件中,增添以下配置内容:

   # 指定代码覆盖率工具
    sonar.core.codeCoveragePlugin=jacoco
    # 指定exec二进制文件存放路径
    #sonar.jacoco.reportPaths=[Your path]/jacoco.exec
    #本demo之前设置的exec文件是在工程根目录下的target/coverage-reports下:
    sonar.jacoco.reportPaths=target/coverage-reports/jacoco-unit.exec
    # 以下属性可选择性加,当然也可以不加
    sonar.dynamicAnalysis=reuseReports
    sonar.jacoco.reportMissing.force.zero=false

2.在 SoarQube 登录 admin,并通过在【配置-应用市场】下找到Jacoco插件并安装和重启。

4.3 运行

  1. 在项目根目录下,运行 mvn package,当build成功的时候Jacoco的结果就会产生在target/site/jacoco文件夹下。

maven package

  1. 接着,在项目根目录下运行命令 sonar-scanner,如果看到以下结果证明已经覆盖率已经可以在SonarQube上查阅。

sonar scanner

以上,后续继续补充如何通过 SonarLint 整合到 IntelliJ IDEA,并同时如何整合到 Jenkins 实现自动化测试。

本文遵循 CC 4.0 BY-SA 版权协议,原文链接:
https://blog.csdn.net/justyman/article/details/87563883

相关文章

一文搞懂测试左移和测试右移的 Why-How-What

精准化测试技术解读与平台构建最佳实践