## :-: 采用SonarQube进行代码规范及单元测试覆盖率检查
## 一、SonarQube安装
### 1.1 临时修改配置
sysctl -w vm.max_map_count=262144
### 1.2 docker-compose up -d
```
version: "3"
services:
postgres:
image: postgres:12
networks:
- sonarnet
restart: always
container_name: postgres
ports:
- "5432:5432"
environment:
- POSTGRES_USER=sonar
- POSTGRES_PASSWORD=sonar
volumes:
- postgresql_data:/var/lib/postgresql/data
sonarqube:
image: sonarqube:8.2-community
ports:
- "9000:9000"
networks:
- sonarnet
restart: always
container_name: sonar
depends_on:
- postgres
environment:
SONARQUBE_JDBC_USERNAME: sonar
SONARQUBE_JDBC_PASSWORD: sonar
SONARQUBE_JDBC_URL: jdbc:postgresql://postgres:5432/sonar
volumes:
- sonarqube_conf:/opt/sonarqube/conf
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins
networks:
sonarnet:
driver: bridge
volumes:
sonarqube_conf:
sonarqube_data:
sonarqube_extensions:
sonarqube_bundled-plugins:
postgresql_data:
```
### 1.3 访问
http://ip:9000,管理员默认账号和密码为admin/admin
![](https://img.kancloud.cn/cd/91/cd91dc026a1fd9219dd98f2d7e21f6ec_1704x420.jpg)
### 1.4 中文插件安装
![](https://img.kancloud.cn/84/db/84db16f67e4eeec619d494e7b091ff32_1656x850.jpg)
## 二、SonarQube安装P3C插件
### 2.1 下载插件代码并构建
```
>git clone https://github.com/rhinoceros/sonar-p3c-pmd
>cd sonar-pmd-p3c
>mvn clean install -Dmaven.test.skip=true
```
注意:验证时是直接从https://github.com/rhinoceros/sonar-p3c-pmd/tags下载的`pmd-3.2.0-beta-with-p3c1.3.6-pmd6.10.0`
### 2.2 安装插件
注意:由于sonar-pmd-p3c是在sonar-pmd-plugin基础上修改的,所以如果已安装sonar-pmd-plugin,需要先删除原插件。
```
>rm -f /opt/sonarqube/extensions/plugins/sonar-pmd*
>cp sonar-pmd-p3c/target/sonar-pmd-plugin-3.2.1.jar /opt/sonarqube/extensions/plugins
```
### 2.3 配置
* 重启 SonarQube,打开 质量配置`Quality Profiles`页,点击右上方的`创建`按钮,创建`p3c profiles`
![](https://img.kancloud.cn/3b/b2/3bb242a7b4725006c1306e8a3d87a725_2654x1348.png)
* 首次创建会跳转到代码规则配置页面,刚新建的 profile 是没有激活任何规则的,需要手动激活
![](https://img.kancloud.cn/c7/32/c73215c5c0cecb7142b2e9a9b5a39d5b_2676x1590.png)
* 跳转到激活页面,搜索p3c,如图,都是以`[p3c]`开头的规则
![](https://img.kancloud.cn/e9/6a/e96ab48d63d7964c0390f0d06ce11c8e_2846x1554.png)
* 批量修改->活动 p3c -> 应用 -> 成功
![](https://img.kancloud.cn/83/28/8328a239b96c6c8d29034dcd26e39b0b_2680x1564.png)
![](https://img.kancloud.cn/4c/3c/4c3c4ea38f18e21080a570e364c0a71d_2670x1414.png)
* 绑定规则成功后基本完成,我们返回`质量配置`,在`java`选择刚设置的`p3c`设置为默认
![](https://img.kancloud.cn/a2/88/a2885e08f525719dcce11369a0e50e9f_2692x1704.png)
## 三、单元测试报告插件介绍
* 项目pom.xml配置
```
<!--不显示引入,在执行 mvn test 命令时也会自动引入maven-surefire-plugin-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!--忽略mvn test 命令-->
<skip>false</skip>
<includes>
<include>**/*Test.java</include>
</includes>
<argLine>${surefireArgLine}</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<configuration>
<aggregate>true</aggregate>
</configuration>
</plugin>
</plugins>
</build>
```
* 结果查看
surefire 插件会在mvn test命令后在/target/surefire-reports目录中生成XML和TXT的单元测试报告,maven-surefire-report-plugin插件会把target/surefire-reports下的所有xml报告转换成一份html格式的文件。并将这个html格式的测试报告保存在target/site目录下如下:
**注意:maven-surefire-report-plugin插件需要单独执行mvn surefire-report:report**
![](https://img.kancloud.cn/41/d5/41d570abda43b3bc5a4ae025ee693b2b_695x620.jpg)
## 四、代码覆盖率插件介绍
Java中常用的代码覆盖率统计的插件有 JaCoCo 与Cobertura,推荐使用JaCoCo,下面是两者对比:
![](https://img.kancloud.cn/cf/84/cf84ce2c7447e15bf7b0ac6b8e45537c_1534x884.png)
* 项目pom.xml配置
```
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-unit-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<propertyName>surefireArgLine</propertyName>
</configuration>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${basedir}/target/jacoco.exec</dataFile>
<outputDirectory>${basedir}/target/site/jacoco</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
```
* 结果查看
执行 mvn test命令后在/target/jacoco.exec生成记录文件,同时会将代码执行情况文件转换生成为 jacoco 报表,在/target/site/jacoco目录下。
![](https://img.kancloud.cn/9a/24/9a243ec480a00385c5cd002c8a010c06_669x853.jpg)
## 五、代码检查
`sonarqube`可以使用多种方式进行代码检查,我们使用简单的`Maven`触发代码检查。步骤如下:
1、maven 对项目进行编译打包,并执行单元测试用例,mvn test package install
2、自动执行surfile 和 jacoco 插件
3、使用 mvn sonar:sonar 命令,将代码覆盖率报表推送到 sonarqube 平台
4、登录 sonarqube 查看代码覆盖率统计报告(也可以本地访问 jacoco/index.html 直接查看报告)
* 项目pom.xml配置
```
<!--不显示引入,在执行MAVEN命令时也会自动引入-->
<build>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.6.0.1398</version>
</plugin>
</plugins>
</build>
```
```
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.host.url>http://ip:9000</sonar.host.url>
<!--如果sonarQube项目配置的允许Anyone执行分析,则以下属性不配置-->
<sonar.login>yjj</sonar.login>
<sonar.password>yjj</sonar.password>
</properties>
</profile>
</profiles>
```
* 先构建项目`mvn package`,注意package时要同时执行`mvn test`,再执行`mvn sonar:sonar`
![](https://img.kancloud.cn/e2/5f/e25fd5e276e98b692361be6d33af8396_1296x922.png)
* 查看报告
![](https://img.kancloud.cn/b3/9c/b39c5dcd0e18a254afec716787308dfc_1688x587.jpg)
可以看到上传的项目列表,选择项目查看分析结果,项目健康状态,代码覆盖率等信息
![](https://img.kancloud.cn/2d/0d/2d0de61fb173cf0d38eadeda4fad2133_1727x1060.jpg)