2021-05-12 14:32:11
使用 Sonar 進行程式碼品質管理
本文將介紹程式碼品質管理平台 Sonar 的搭建和使用。Sonar 是一個開源平台,用於管理原始碼的品質。您將看到 Sonar 從安裝到設定的過程,以及如何在專案中使用 Maven 外掛方便地進行程式碼品質管理。
Sonar 概述
Sonar 是一個用於程式碼品質管理的開放平台。通過外掛機制,Sonar 可以整合不同的測試工具,程式碼分析工具,以及持續整合工具。
與持續整合工具(例如 Hudson/Jenkins 等)不同,Sonar 並不是簡單地把不同的程式碼檢查工具結果(例如 FindBugs,PMD 等)直接顯示在 Web 頁面上,而是通過不同的外掛對這些結果進行再加工處理,通過量化的方式度量程式碼品質的變化,從而可以方便地對不同規模和種類的工程進行程式碼品質管理。
在對其他工具的支援方面,Sonar 不僅提供了對 IDE 的支援,可以在 Eclipse 和 IntelliJ IDEA 這些工具裡聯機檢視結果;同時 Sonar 還對大量的持續整合工具提供了介面支援,可以很方便地在持續整合中使用 Sonar。
此外,Sonar 的外掛還可以對 Java 以外的其他程式語言提供支援,對國際化以及報告文件化也有良好的支援。
Sonar 的安裝
Sonar 是 Codehaus 上面的一個開源專案,使用的是 LGPL V3 軟體許可。我們可以在其官方網站上下載其原始碼及安裝包。
其原始碼需要使用分散式版本控制軟體 Git 進行檢出(Check Out),命令列方式如下:
git clone git://github.com/SonarSource/sonar.git
本文主要介紹 Sonar 的使用方法,只需要到 Sonar 網站下載最近的發行包即可,本文寫作時最新的版本為 2.11。
下載 zip 包後,直接解壓到任意目錄,由於 Sonar 自帶了 Jetty 6 的應用伺服器環境,所以不需要額外的安裝就可以使用,值得一提的是 Sonar 也支援部署在 Apache Tomcat 應用伺服器中。
在 windows 環境中,直接啟動 Soanr 的 bin 目錄下 windows-x86-64StartSonar.bat 即可。
然後在瀏覽器中存取:http://localhost:9000/
圖 1. Sonar 存取介面
這樣就成功安裝並啟動了 Sonar,但其中沒有安裝外掛,需要使用者下載並安裝自己所需要的外掛。本節以 Quality Index Plugin 為例,介紹如何下載及安裝 Sonar 外掛。
首先存取 Sonar 主頁中 Dashboard > Sonar > Documentation > Sonar Plugin Library 路徑
圖 2. Sonar 外掛的下載
進入 Quality Index 外掛,點選下載路徑
圖 3. Quality Index Plugin 下載
然後將下載的 sonar-quality-index-plugin-1.1.3.jar 檔案放到 sonar-2.11extensionsplugins 路徑下。重新啟動 Sonar,該外掛就在 Sonar 的平台上執行並開始工作。
資料庫設定
Sonar 預設使用的是 Derby 資料庫,但這個資料庫一般用於評估版本或者測試用途。商用及對資料庫要求較高時,建議使用其他資料庫。Sonar 可以支援大多數主流關係型資料庫(例如 Microsoft SQL Server, MySQL, Oracle, PostgreSQL 等)
本文以 MySQL 為例說明如何更改 Sonar 的資料庫設定:
- 在 MySQL 中建立 sonar 使用者
CREATE USER sonar IDENTIFIED BY 'sonar'; GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar' WITH GRANT OPTION;
- 將 MySQL 的驅動檔案(如 mysql-connector-java-5.1.13.jar)拷貝到 sonar-2.11extensionsjdbc-drivermysql 目錄
- 修改 sonar-2.11confsonar.properties 檔案,用 # 注釋原來 Derby 的設定項,並開啟 MySQL 資料庫的設定項:
# Comment the following lines to deactivate the default embedded database. #sonar.jdbc.url: jdbc:derby://localhost:1527/sonar;create=true #sonar.jdbc.driverClassName: org.apache.derby.jdbc.ClientDriver #sonar.jdbc.validationQuery: values(1) ~~~~~~~~~~~~~~~省略部分~~~~~~~~~~~~~~~~~~ #----- MySQL 5.x/6.x # Comment the embedded database and uncomment the following #properties to use MySQL. The validation query is optional. sonar.jdbc.url: jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8 sonar.jdbc.driverClassName: com.mysql.jdbc.Driver #sonar.jdbc.validationQuery: select 1
- 重新啟動 Sonar。
使用 Sonar 進行程式碼品質管理
為了不涉及程式碼的版權問題及方便讀者試驗,本節以開源專案 Mojo 為例,說明如何使用 Sonar 對原始碼進行品質管理,在不涉及編譯的情況下,本文盡量使用 Sonar 的 Nemo 演示功能。
首先,需要從 Mojo 首頁上下載原始碼(本文使用 TortoiseSVN 工具),如圖所示,Mojo 專案包括了許多工程。
圖 4. Mojo 工程資料夾
其中的每個工程都是一個 Maven 專案,如圖所示:
圖 5. Maven 工程檔案
編譯命令如下:
mvn clean install
編譯成功後,再使用如下命令:
mvn sonar:sonar
Maven 外掛會自動把所需資料(如單元測試結果、靜態檢測結果等)上傳到 Sonar 伺服器上,需要說明的是,關於 Sonar 的設定並不在每個工程的 pom.xml 檔案裡,而是在 Maven 的組態檔 settings.xml 檔案裡,具體設定如下:
<profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <sonar.jdbc.url> jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8 </sonar.jdbc.url> <sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver> <sonar.jdbc.username>sonar</sonar.jdbc.username> <sonar.jdbc.password>sonar</sonar.jdbc.password> <sonar.host.url>http://localhost:9000</sonar.host.url> </properties> </profile>
將 Soanr 所需要的資料上傳到 Sonar 伺服器上之後,Sonar 安裝的外掛會對這些資料進行分析和處理,並以各種方式顯示給使用者,從而使使用者方便地對程式碼品質的監測和管理。
例如 Radiator 外掛可以根據專案的規模進行排序,並用不同演示顯示程式碼品質:
圖 6. Radiator 外掛的顯示
Sonar 外掛的設定
前面已經提到,Sonar 的主要特色是對不同工具產生的檢查結果進行再加工處理,Sonar 還向使用者提供了對資料進行個性化處理的方法。
本節以 Technical Debt 外掛為例說明如何通過設定引數影響最後的報告結果。首先了解一下這個外掛中的“技術債務”的概念,這個概念最早是在 1992 年由 Ward Cunningham 在他的論文“The WyCash Portfolio Management System”中提出的,之後被軟體工程界接受並推廣,《重構》的作者 Martin Fowler 也在其 網站上對技術債務有所介紹。其實原理可以理解為“出來混早晚要還的”,當前不規範的程式碼,會對以後產品修改的成本造成影響。
Soanr 的 Technical Debt 外掛提供了預設的計算公式,通過對其中的權重引數進行設定,可以適應不同公司和專案對技術債務的計算。
圖 7. Technical Debt 計算公式
以上的各項資料指標,可以根據自己公司和專案的不同情況進行設定,如圖所示:
圖 8. Sonar 設定介面
例如預設引數下同一個專案的技術債務指標如下:
圖 9. 預設引數下 Technical Debt 結果
修改了引數後的結果為:
圖 10. 設定引數後 Technical Debt 結果
可見將 Average time to cover complexity of one (in hours) 從 0.2 修改為 0.01 後,Coverage 的權重變小了,從而達到忽略單元測試覆蓋率的作用。不同的公司和專案可以根據需要調整各自的引數,引數的調優和策略不在本文的討論範圍之內。
通過以上的範例可以看出,Sonar 使用不同型別的圖表顯示給使用者程式碼品質的結果,並且這些圖表不是簡單地對單元測試覆蓋率或者靜態檢測工具的結果進行顯示,而是根據軟體工程理論進行了二次加工後的結果,更加科學和直觀。
結束語
Sonar 為程式碼的品質管理提供了一個平台,對傳統的程式碼靜態檢測如 PMD、FindBugs 等工具進行整合,可以說是目前最強大的程式碼品質管理工具之一。
Sonar 的詳細介紹:請點這裡
Sonar 的下載地址:請點這裡
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-08/133876.htm
相關文章