Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
項目執(zhí)行mvn test指令生成的 測試用例文件在標(biāo)紅位置
將生成的測試用例導(dǎo)入到sonar中
按默認(rèn)值設(shè)置sonar.junit.reportPaths
執(zhí)行命令將測試結(jié)果上傳到sonarqube中
默認(rèn)
SONARQUBE_TOKEN=22e813fd70f53cac585ced071058a79fa2a91ff6
#執(zhí)行測試,把默認(rèn)位置的測試結(jié)果上傳
mvn clean test sonar:sonar \
-Dmaven.test.failure.ignore=true \ #忽略測試失敗
-Dsonar.host.url=http://192.168.132.128:9000 \ #sonar 服務(wù)器地址
-Dsonar.login=$SONARQUBE_TOKEN \
-Dsonar.ws.timeout=300 \ # 超時時間
-Dsonar.projectKey=litemall-$USER \
-Dsonar.projectName=litemall-$USER
執(zhí)行成功
使用自定義位置上傳測試結(jié)果
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 服務(wù)器地址
-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底層技術(shù)
jacoco底層使用asm框架對代碼所生成的類文件進(jìn)行修改,加入統(tǒng)計指令,從而得知代碼有沒有被覆蓋
ASM:所有字節(jié)碼插樁框架的底層,性能最高,apm框架的核心基礎(chǔ)
JavaAssist:簡單易用
ByteBuddy、BTrace、 JVM- Sandbox
覆蓋率統(tǒng)計原理 對代碼塊及執(zhí)行路徑進(jìn)行覆蓋
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到本地服務(wù)器
#以on the fly模式啟動被測應(yīng)用
java -javaagent:./org.jacoco.agent-0.8.6-runtime.jar -jar apache-jmeter-5.4.1/bin/ApacheJMeter.jar
#執(zhí)行后正常結(jié)束被測程序會得到覆蓋率統(tǒng)計文件,被測應(yīng)用只要得到執(zhí)行就可以統(tǒng)計到覆蓋率,
可以跟測試用例不在同一個服務(wù)器上。
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
#生成有源代碼關(guān)聯(lián)的報告
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/
覆蓋率生成位置
動態(tài)生成覆蓋率
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
執(zhí)行會在命令行指向目標(biāo)地址,只要打包運行后就會生成exec文件
生成exec文件,通過sonar將exec文件傳給服務(wù)器
覆蓋率導(dǎo)入sonarqube 默認(rèn)路徑
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執(zhí)行分析
生成jacoco的覆蓋率報告
加載exec文件生成報告
生成的覆蓋率報告
上傳報告到sonar
### 覆蓋率導(dǎo)入sonarqube
默認(rèn)路徑
```
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插件
白盒測試更容易發(fā)現(xiàn)bug
IPS
本文基于SonarQube 7.9.1,理論支持6.0及更高版本。
SonarQube是一個開源的代碼質(zhì)量管理系統(tǒng),可用來快速定位代碼中的Bug、漏洞以及不優(yōu)雅的代碼。它支持幾乎所有的常見編程語言,例如Java、JavaScript、TypeScript、Kotlin、Ruby、Go, Scala等。并且還有插件機制,利用插件,可以讓SonarQube更加強大,例如可以整合Findbugs、PMD、Checkstyle等??梢哉f,SonarQube是一款提升項目代碼質(zhì)量必備的根據(jù)。
本文手把手搭建、使用SonarQube。
前往 https://www.sonarqube.org/downloads/ ,按照如圖說明下載即可。建議下載 LTS 版本,以便獲得長期的維護(hù)與支持。
?X64的操作系統(tǒng)
?JDK(對于7.9.x,那么需要JDK 11或更高版;對于6.x - 7.8.x,需要JDK 8或更高版本)
?2G內(nèi)存
其他需求詳見:https://docs.sonarqube.org/7.9/requirements/requirements/[1]
TIPS
?《其他需求》建議大家參照一下,里面探討如何修改Linux文件描述符限制等說明;
?上面貼的是是7.9版的鏈接,如果你使用的是其他版本,只需將版本名稱改掉即可,例如改為7.8即可查看7.8.x的需求。
1 解壓壓縮包
2 將目錄切換到SonarQube的 /bin 目錄,可看到類似如下的目錄結(jié)構(gòu):
├── bin │ ├── jsw-license │ ├── linux-x86-64 │ ├── macosx-universal-64 │ └── windows-x86-64
3 根據(jù)你的操作系統(tǒng),切換到響應(yīng)目錄。例如,您的機器是macOS ,則可切換到 macosx-universal-64 目錄。
4 執(zhí)行如下命令即可啟動SonarQube。
./sonar.sh start
當(dāng)然,該shell還有其他命令,可輸入 ./sonar.sh --help 或者 ./sonar.sh 查閱。
5 稍等片刻,訪問 http://localhost:9000/ 即可看到類似如下的界面,說明安裝成功。
6 停止SonarQube,只需執(zhí)行 ./sonar.sh stop 即可。
7 如需重啟,只需執(zhí)行 ./sonar.sh restart 即可。
訪問:http://localhost:9000
賬號:admin
密碼:admin
默認(rèn)情況下,SonarQube使用的是H2數(shù)據(jù)庫,這是一款非常流行的嵌入式數(shù)據(jù)庫。但生產(chǎn)環(huán)境中,SonarQube并不建議使用H2。SonarQube支持多種數(shù)據(jù)庫,例如Qracle、PostgreSQL、SQL Server等。下面,我們以PostgreSQL為例,讓SonarQube使用PostgreSQL存儲數(shù)據(jù)。
TIPS
支持的數(shù)據(jù)庫及數(shù)據(jù)庫版本請前往這篇文檔查看,避免SonarQube不支持你的數(shù)據(jù)庫版本以及注意點。
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 找到類似如下的內(nèi)容:
#----- 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
在這行下面,添加如下內(nèi)容:
sonar.jdbc.url=jdbc:postgresql://localhost/sonar?currentSchema=public sonar.jdbc.username=itmuch sonar.jdbc.password=itmuch
這里,數(shù)據(jù)庫地址、賬號、密碼根據(jù)你的需求修改。
3 執(zhí)行 ./sonar.sh restart ,重啟SonarQube。觀察PostgreSQL,可以發(fā)現(xiàn),此時SonarQube會自動在PostgreSQL數(shù)據(jù)庫中建表并插入初始化數(shù)據(jù)。
4 類似的方式,你也可以為你的SonarQube配置其他數(shù)據(jù)庫。
方法一:全局配置
1 在Maven的全局配置文件: $MAVEN_PATH/conf/settings.xml (也可能是.m2/settings.xml 看你是怎么配置Maven的)中添加如下內(nèi)容:
<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項目的根目錄執(zhí)行如下命令,即可使用SonarQube分析項目:
mvn sonar:sonar -Dsonar.java.binaries=target/sonar
等待片刻后,項目構(gòu)建成功:
[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已經(jīng)為我們分析了一個項目,該項目有1個Bug、2個脆弱點、31個代碼味道問題。點擊項目名稱(圖中的 Spring Cloud YES)即可看到詳情,可以根據(jù)SonarQube給我們的提示進(jìn)行修正、重構(gòu)。
方法二:直接命令行控制
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 按照圖示進(jìn)行操作:
2 點擊 Install 按鈕后,將會彈出重啟SonarQube的提示,點擊即可重啟。重啟后,可看到類似如下的界面
3 類似的方式,也可為SonarQube安裝其他插件。
干貨分享
最近將個人學(xué)習(xí)筆記整理成冊,使用PDF分享。關(guān)注我,回復(fù)如下代碼,即可獲得百度盤地址,無套路領(lǐng)取!
?001:《Java并發(fā)與高并發(fā)解決方案》學(xué)習(xí)筆記;
?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學(xué)習(xí)筆記;
?003:《Java面試寶典》
?004:《Docker開源書》
?005:《Kubernetes開源書》
?006:《DDD速成(領(lǐng)域驅(qū)動設(shè)計速成)》
過前面章節(jié)我們可以看到,不論怎么構(gòu)建,單元測試覆蓋率一欄總是0%
這是因為單元測試覆蓋率報告需要額外集成.這一節(jié)我們就講解如何在sonarqube里集成單元測試覆蓋率報告.
這里需要借助Opencover來生成單元測試覆蓋報告文檔,Opencover前面章節(jié)我們介紹過,不了解的朋友可以查看一下前面相關(guān)部分的章節(jié).
我在本地有一個包含單元測試項目(大家可以自己建一個包含單元測試的項目,關(guān)于單元測試前面章節(jié)也有詳細(xì)講解,這里不再贅述).進(jìn)入包含項目sln或者csproj的文件,執(zhí)行以下命令.
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 動態(tài)屬性.通過動態(tài)屬性指定單元測試報告的位置.%CD%即為當(dāng)前目錄
第二段 msbuild.exe執(zhí)行構(gòu)建.
第三段 這里是生成單元測試覆蓋率報告的關(guān)鍵. 首先指定Opencover所在位置,-register user 為注冊當(dāng)前windows用戶以使其有權(quán)限執(zhí)行.-output 指定覆蓋率文件輸出位置,這里必須和上面的 sonar.cs.opencover.reportsPaths保持一致. -target為要指定的單元測試runner,這里使用的是visual studio自帶的vstest.console.exe targetargs指定要進(jìn)行單元測試的目標(biāo)dll.
執(zhí)行完成以后,我們再打開sonarqube web管理界面就會看到剛剛生成的mytest項目
通過上圖我們可以看到mytest項目的單元測試覆蓋率為56.7%
我們進(jìn)入mytest這個項目,然后點擊單元測試覆蓋率數(shù)字下面的鏈接
點擊后進(jìn)入以下頁面:
通過這個界面,我們可以看到每一個類的的單元測試覆蓋率和未覆蓋的行數(shù).我們點擊類名,便可以進(jìn)入具體的類.
這個圖中,藍(lán)杠部分為單元測試覆蓋到的代碼,紅框部分則為未覆蓋到的代碼.
對于管理員來說,可能僅僅需要大致瀏覽一下代碼,然后告知具體開發(fā)者需要修改.對于開發(fā)者來說,可能需要詳細(xì)查看代碼.以上截圖只截了主視窗,實際上左側(cè)還有固定的導(dǎo)航欄.這樣對于查看代碼可能不是很友好,詳細(xì)查看代碼的時候我們可能想在更大的視窗里查看.這時候我們可以點擊右上角的"四杠圖標(biāo)"
選擇open in new window便可以在新窗口中打開代碼.此時整個區(qū)域都是代碼,無關(guān)的內(nèi)容都沒了
以上代碼雖然在一個單獨的視窗里顯示,但是仍然有藍(lán)杠和紅杠標(biāo)識,有些童鞋可能感覺不是很舒服,想要看到清潔代碼,此時點擊四框圖標(biāo)選擇Show raw source即可顯示原始代碼.
原文地址:https://www.cnblogs.com/tylerzhou/p/11253855.html
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。