項目執行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
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配置其他數據庫。
方法一:全局配置
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
*請認真填寫需求信息,我們會在24小時內與您取得聯系。