整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          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


          主站蜘蛛池模板: 亚洲一区二区成人| 中文字幕一区二区三区在线不卡| 久久久精品人妻一区二区三区蜜桃 | 无码人妻精品一区二区三| 美女一区二区三区| 无码国产精品一区二区免费式影视| 亚洲性色精品一区二区在线| 人妻无码一区二区视频| 亚洲国产日韩一区高清在线| 国内自拍视频一区二区三区| 极品少妇伦理一区二区| 国产激情з∠视频一区二区 | 2022年亚洲午夜一区二区福利 | 国产午夜精品一区二区| 亚洲乱码国产一区网址| 久久久人妻精品无码一区| 色婷婷亚洲一区二区三区| 午夜无码视频一区二区三区| 国产激情无码一区二区app| 日韩免费一区二区三区在线| 国产午夜三级一区二区三| 亚洲丰满熟女一区二区v| 一区二区三区免费精品视频| 中文无码一区二区不卡αv| 中文字幕一区二区三区日韩精品| 蜜桃AV抽搐高潮一区二区| 老熟女五十路乱子交尾中出一区| 婷婷亚洲综合一区二区| 精品人无码一区二区三区| 无码乱人伦一区二区亚洲一| 国产一区二区三区露脸| 亚洲午夜日韩高清一区| 尤物精品视频一区二区三区 | 国产成人高清精品一区二区三区 | 国产成人高清亚洲一区91| 亚洲一区二区无码偷拍| 熟女精品视频一区二区三区| 国产另类ts人妖一区二区三区| 精品国产日韩一区三区| 国语对白一区二区三区| 久久精品成人一区二区三区|