整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

sonar代码覆盖率实战

onar接入测试结果

项目执行mvn test指令生成的 测试用例文件在标红位置

将生成的测试用例导入到sonar中

按默认值设置sonar.junit.reportPaths

执行命令将测试结果上传到sonarqube中

默认

SONARQUBE_TOKEN=22e813fd70f53cac585ced071058a79fa2a91ff6

#执行测试,把默认位置的测试结果上传
mvn clean test sonar:sonar \
  -Dmaven.test.failure.ignore=true \  #忽略测试失败
  -Dsonar.host.url=http://192.168.132.128:9000   \ #sonar 服务器地址
  -Dsonar.login=$SONARQUBE_TOKEN \
  -Dsonar.ws.timeout=300 \   # 超时时间
  -Dsonar.projectKey=litemall-$USER \  
  -Dsonar.projectName=litemall-$USER

执行成功

使用自定义位置上传测试结果

find . -name "surefire*" ./litemall-db/target/surefire-reports

mvn clean test sonar:sonar   \
  -Dmaven.test.failure.ignore=true \
  -Dsonar.host.url=http://192.168.132.128:9000   \ #sonar 服务器地址
  -Dsonar.login=$SONARQUBE_TOKEN   \
  -Dsonar.ws.timeout=300 \
  -Dmaven.test.skip=false \
  -Dsonar.junit.reportPaths='./litemall-db/target/surefire-reports,./litemall-db/target/surefire-reports'

覆盖率工具

jacoco底层技术

jacoco底层使用asm框架对代码所生成的类文件进行修改,加入统计指令,从而得知代码有没有被覆盖

ASM:所有字节码插桩框架的底层,性能最高,apm框架的核心基础

JavaAssist:简单易用

ByteBuddy、BTrace、 JVM- Sandbox

覆盖率统计原理 对代码块及执行路径进行覆盖

jacoco mvn插件使用

https://www.jacoco.org/jacoco/trunk/doc/maven.html

jacoco 命令行使用

https://www.jacoco.org/jacoco/trunk/doc/cli.html

手工统计覆盖率

  • 对被测应用进行插桩,然后启动on the fly模式javaagent模式可以在内存中动态修改class字节码,不会修改jar包,所以jar包大小不变offline模式,修改jar包中的class文件,文件会变大
  • 执行测试行为
  • 导出覆盖率统计结果
  • 生成报告
agent下载地址 https://repo1.maven.org/maven2/org/jacoco/org.jacoco.agent/0.8.6/ 5
cli工具下载地址 https://repo1.maven.org/maven2/org/jacoco/org.jacoco.cli/0.8.6/ 2

下载jar到本地服务器

#以on the fly模式启动被测应用
java -javaagent:./org.jacoco.agent-0.8.6-runtime.jar -jar apache-jmeter-5.4.1/bin/ApacheJMeter.jar 
#执行后正常结束被测程序会得到覆盖率统计文件,被测应用只要得到执行就可以统计到覆盖率,
可以跟测试用例不在同一个服务器上。
ls jacoco.exec 
#生成无源代码的报告 
java -jar org.jacoco.cli-0.8.6-nodeps.jar report jacoco.exec --classfiles apache-jmeter-5.4.1/bin/ApacheJMeter.jar --html jacoco_html 
#生成有源代码关联的报告
java -jar org.jacoco.cli-0.8.6-nodeps.jar report jacoco.exec --classfiles apache-jmeter-5.4.1/bin/ApacheJMeter.jar --html jacoco_html_src --sourcefiles apache-jmeter-5.4.1_src/apache-jmeter-5.4.1/src/launcher/src/main/java/ 

覆盖率生成位置


动态生成覆盖率

mvn clean \ 
org.jacoco:jacoco-maven-plugin:0.8.5:prepare-agent \ 
test \ 
org.jacoco:jacoco-maven-plugin:0.8.5:report \ 
 -Dmaven.test.failure.ignore=true \ 
 -Dmaven.test.skip=false

执行会在命令行指向目标地址,只要打包运行后就会生成exec文件

生成exec文件,通过sonar将exec文件传给服务器

覆盖率导入sonarqube 默认路径

mvn sonar:sonar \
  -Dsonar.host.url=http://sonarqube.ceshiren.com:9000   \
  -Dsonar.login=$SONARQUBE_TOKEN \
  -Dsonar.ws.timeout=300 \
  -Dsonar.projectKey=litemall-core-$USER \
  -Dsonar.projectName=litemall-core-$USER

sonar执行分析

生成jacoco的覆盖率报告

加载exec文件生成报告

生成的覆盖率报告

上传报告到sonar

### 覆盖率导入sonarqube

默认路径
```
mvn sonar:sonar \
  -Dsonar.host.url=http://sonarqube.ceshiren.com:9000   \
  -Dsonar.login=$SONARQUBE_TOKEN \
  -Dsonar.ws.timeout=300 \
  -Dsonar.projectKey=litemall-core-$USER \
  -Dsonar.projectName=litemall-core-$USER
```

自定义路径
```
SONARQUBE_HOST=http://sonarqube.ceshiren.com:9000 
sonar-scanner \
  -Dsonar.host.url=$SONARQUBE_HOST    \
  -Dsonar.login=$SONARQUBE_TOKEN   \
  -Dsonar.projectKey=litemall_$USER \
  -Dsonar.projectName=litemall_$USER \
  -Dsonar.sources=$(echo **/src | sed 's# #,#g')  \
  -Dsonar.java.binaries="**/target" \
  -Dsonar.junit.reportPaths=$(find . -name "surefire-reports"  | xargs  | sed 's# #,#g') \
  -Dsonar.coverage.jacoco.xmlReportPaths="**/jacoco/jacoco.xml"

pom文件加入jacoco插件


白盒测试更容易发现bug

IPS

本文基于SonarQube 7.9.1,理论支持6.0及更高版本。

SonarQube是一个开源的代码质量管理系统,可用来快速定位代码中的Bug、漏洞以及不优雅的代码。它支持几乎所有的常见编程语言,例如Java、JavaScript、TypeScript、Kotlin、Ruby、Go, Scala等。并且还有插件机制,利用插件,可以让SonarQube更加强大,例如可以整合Findbugs、PMD、Checkstyle等。可以说,SonarQube是一款提升项目代码质量必备的根据。

本文手把手搭建、使用SonarQube。

下载

前往 https://www.sonarqube.org/downloads/ ,按照如图说明下载即可。建议下载 LTS 版本,以便获得长期的维护与支持。

系统需求

•X64的操作系统

•JDK(对于7.9.x,那么需要JDK 11或更高版;对于6.x - 7.8.x,需要JDK 8或更高版本)

•2G内存

其他需求详见:https://docs.sonarqube.org/7.9/requirements/requirements/[1]

TIPS

•《其他需求》建议大家参照一下,里面探讨如何修改Linux文件描述符限制等说明;

•上面贴的是是7.9版的链接,如果你使用的是其他版本,只需将版本名称改掉即可,例如改为7.8即可查看7.8.x的需求。

安装与启动

1 解压压缩包

2 将目录切换到SonarQube的 /bin 目录,可看到类似如下的目录结构:

├── bin
│ ├── jsw-license
│ ├── linux-x86-64
│ ├── macosx-universal-64
│ └── windows-x86-64

3 根据你的操作系统,切换到响应目录。例如,您的机器是macOS ,则可切换到 macosx-universal-64 目录。

4 执行如下命令即可启动SonarQube。

./sonar.sh start

当然,该shell还有其他命令,可输入 ./sonar.sh --help 或者 ./sonar.sh 查阅。

5 稍等片刻,访问 http://localhost:9000/ 即可看到类似如下的界面,说明安装成功。

6 停止SonarQube,只需执行 ./sonar.sh stop 即可。

7 如需重启,只需执行 ./sonar.sh restart 即可。

管理员登录

访问:http://localhost:9000

账号:admin

密码:admin

生产环境可用

默认情况下,SonarQube使用的是H2数据库,这是一款非常流行的嵌入式数据库。但生产环境中,SonarQube并不建议使用H2。SonarQube支持多种数据库,例如Qracle、PostgreSQL、SQL Server等。下面,我们以PostgreSQL为例,让SonarQube使用PostgreSQL存储数据。

TIPS

支持的数据库及数据库版本请前往这篇文档查看,避免SonarQube不支持你的数据库版本以及注意点。

https://docs.sonarqube.org/7.9/requirements/requirements/[2]

举个例子:SonarQube 7.9要求使用PostgreSQL 9.3-9.6或者PostgreSQL 10,并且必须配置使用UTF-8

搭建PostgreSQL

简单起见,我用Docker搭建PostgreSQL。

version: '3.1'
services:
 postgres:
 image: postgres:10
 restart: always
 environment:
 - POSTGRES_USER=itmuch
 - POSTGRES_PASSWORD=itmuch
 - POSTGRES_DB=sonar
 ports:
 - "5432:5432"

修改SonarQube配置

1 修改配置文件:$SONARQUBE_HOME/conf/sonar.properties 。

2 找到类似如下的内容:

#----- PostgreSQL 9.3 or greater
# By default the schema named "public" is used. It can be overridden with the parameter "currentSchema".
#sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube?currentSchema=my_schema

在这行下面,添加如下内容:

sonar.jdbc.url=jdbc:postgresql://localhost/sonar?currentSchema=public
sonar.jdbc.username=itmuch
sonar.jdbc.password=itmuch

这里,数据库地址、账号、密码根据你的需求修改。

3 执行 ./sonar.sh restart ,重启SonarQube。观察PostgreSQL,可以发现,此时SonarQube会自动在PostgreSQL数据库中建表并插入初始化数据。

4 类似的方式,你也可以为你的SonarQube配置其他数据库。

整合Maven

方法一:全局配置

1 在Maven的全局配置文件: $MAVEN_PATH/conf/settings.xml (也可能是.m2/settings.xml 看你是怎么配置Maven的)中添加如下内容:


<profile>
 <id>sonar</id>
 <activation>
 <activeByDefault>true</activeByDefault>
 </activation>
 <properties>
 <sonar.jdbc.url>jdbc:postgresql://localhost/sonar?currentSchema=public</sonar.jdbc.url>
 <sonar.jdbc.driver>org.postgresql.Driver</sonar.jdbc.driver>
 <sonar.jdbc.username>itmuch</sonar.jdbc.username>
 <sonar.jdbc.password>itmuch</sonar.jdbc.password>
 <sonar.host.url>http://127.0.0.1:9000</sonar.host.url>
 </properties>
</profile>

2 到Maven项目的根目录执行如下命令,即可使用SonarQube分析项目:

mvn sonar:sonar -Dsonar.java.binaries=target/sonar

等待片刻后,项目构建成功:

[INFO] Spring Cloud YES ................................... SUCCESS [ 12.431 s]
[INFO] turbine-stream-server .............................. SKIPPED
[INFO] zuul-server ........................................ SKIPPED
[INFO] hystrix-dashboard .................................. SKIPPED
[INFO] commons ............................................ SKIPPED
[INFO] ms-content-sample-mybatis .......................... SKIPPED
[INFO] ms-consumer-sample ................................. SKIPPED

3 此时,再次访问 http://localhost:9000 ,即可看到类似如下的界面:

如右上角所示,此时可以看到SonarQube已经为我们分析了一个项目,该项目有1个Bug、2个脆弱点、31个代码味道问题。点击项目名称(图中的 Spring Cloud YES)即可看到详情,可以根据SonarQube给我们的提示进行修正、重构。

方法二:直接命令行控制

1 右上角头像 - My Account - Security页中,在 Generate New Token 中填入你的Token名称,并点击Generate 按钮。

2 点击按钮后,将会看到生成的Token,例如 62b615f477557f98bc60b396c2b4ca2793afbdea

3 使用如下命令,即可使用Sonar分析项目。

mvn sonar:sonar \
 -Dsonar.host.url=http://localhost:9000 \
 -Dsonar.login=62b615f477557f98bc60b396c2b4ca2793afbdea \
 -Dsonar.java.binaries=target/sonar

插件安装

SonarQube有一个强大的插件机制。以安装汉化插件为例——

1 按照图示进行操作:

2 点击 Install 按钮后,将会弹出重启SonarQube的提示,点击即可重启。重启后,可看到类似如下的界面

3 类似的方式,也可为SonarQube安装其他插件。

干货分享

最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!

•001:《Java并发与高并发解决方案》学习笔记;

•002:《深入JVM内核——原理、诊断与优化》学习笔记;

•003:《Java面试宝典》

•004:《Docker开源书》

•005:《Kubernetes开源书》

•006:《DDD速成(领域驱动设计速成)》

过前面章节我们可以看到,不论怎么构建,单元测试覆盖率一栏总是0%

这是因为单元测试覆盖率报告需要额外集成.这一节我们就讲解如何在sonarqube里集成单元测试覆盖率报告.

这里需要借助Opencover来生成单元测试覆盖报告文档,Opencover前面章节我们介绍过,不了解的朋友可以查看一下前面相关部分的章节.

我在本地有一个包含单元测试项目(大家可以自己建一个包含单元测试的项目,关于单元测试前面章节也有详细讲解,这里不再赘述).进入包含项目sln或者csproj的文件,执行以下命令.

MSBuild.SonarQube.Runner.exe begin /k:"mytest" /n:"mytest" /v:"v1.0" /d:sonar.cs.opencover.reportsPaths="%CD%\testcover.xml"

msbuild.exe

"E:\personalproject\newTest2018\ConsoleApp1\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe" -output:"%CD%\testcover.xml" -register:user -target:"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" -targetargs:"%CD%\bin\Debug\NunitTest.dll"

MSBuild.SonarQube.Runner.exe end

Begin 和end是固定格式,这里begin部分多了一个/d选项,/d为dynamic properties 动态属性.通过动态属性指定单元测试报告的位置.%CD%即为当前目录

第二段 msbuild.exe执行构建.
第三段 这里是生成单元测试覆盖率报告的关键. 首先指定Opencover所在位置,-register user 为注册当前windows用户以使其有权限执行.-output 指定覆盖率文件输出位置,这里必须和上面的 sonar.cs.opencover.reportsPaths保持一致. -target为要指定的单元测试runner,这里使用的是visual studio自带的vstest.console.exe targetargs指定要进行单元测试的目标dll.

执行完成以后,我们再打开sonarqube web管理界面就会看到刚刚生成的mytest项目

通过上图我们可以看到mytest项目的单元测试覆盖率为56.7%

我们进入mytest这个项目,然后点击单元测试覆盖率数字下面的链接

点击后进入以下页面:

通过这个界面,我们可以看到每一个类的的单元测试覆盖率和未覆盖的行数.我们点击类名,便可以进入具体的类.

这个图中,蓝杠部分为单元测试覆盖到的代码,红框部分则为未覆盖到的代码.

代码大视窗显示.

对于管理员来说,可能仅仅需要大致浏览一下代码,然后告知具体开发者需要修改.对于开发者来说,可能需要详细查看代码.以上截图只截了主视窗,实际上左侧还有固定的导航栏.这样对于查看代码可能不是很友好,详细查看代码的时候我们可能想在更大的视窗里查看.这时候我们可以点击右上角的"四杠图标"

选择open in new window便可以在新窗口中打开代码.此时整个区域都是代码,无关的内容都没了

以上代码虽然在一个单独的视窗里显示,但是仍然有蓝杠和红杠标识,有些童鞋可能感觉不是很舒服,想要看到清洁代码,此时点击四框图标选择Show raw source即可显示原始代码.


原文地址:https://www.cnblogs.com/tylerzhou/p/11253855.html