如何看懂 Sonar 報表
Sonar 主要還是透過maven的一些plugins像 PMD , CPD , findbugs , checkstyle , cobertura(coverage ) , JavaNCSS ,…來對java程式碼做靜態分析(static analysis),然後用比較美觀的方式呈現將各種報表整合在一起。想要看懂Sonar 的分析結果,就得先了解它做了那些方面的分析。所有相關分析的術語跟分析方式的概要說明在這裡 。
Dashboard
Dashboard看的是統計跟平均值,真正有用的資訊,應該是drilldown進去看到細節會比較有用
Dashboard中常會看到向上或向下的三角型,通常會有灰、紅、綠三色,那個叫Tendency ,是指跟前一次build出來的results比較的結果.
Rules Compliance
左邊的圖是程式五項能力指標
Usa. Usability可用性
Eff. Efficiency 效率
Mai. Maintainabilitiy 維護性
Por. Portability 可攜性
Rel. Reliability 可靠性
愈高愈好,最好能五個指標都是 100%
右邊的Voilations是程式經過checkstyle, PDM, findbugs,….這些rule檢查後的不通過數量,嚴重性依上而下為
Blocker阻塞
Critical嚴重
Major主要
Minor次要
Info資訊
檢查不通過的數量當然是愈少愈好,理想值是都為0
建議盡可能的把所有的check rules打開,然後再把不適用的rule做調整或停用
Code coverage
程式的單元測試覆蓋率
line converage 行覆蓋率 : 100行程式碼,有95被測到,就算95%
branch coverage 分支覆蓋率 : if - elseif - else 如果只測到if內的code就只有33%,若測到 if - elseif 就是66%,if - elseif - else全測到就是100%
tests test class數量
skipped略過沒測的數量
另外常見的還有
class converage : 類別覆蓋率
method converage : 方法覆蓋率
覆蓋率愈高愈好,100%為理想值,但通常,粒度(Grain)的單位愈小,愈難達到100%,粒度的大小由上至下為,類別 > 方法 > 分支 > 行一般來說,建議值為: * class converage 100% * method converage 100%
branch coverage 採用TDD 的號稱可以達到95%, 但個人建議值在 70% 以上
line coverage 採用TDD 的號稱可以達到95%, , 但個人建議值在 80% 以上
覆蓋率比較有爭議性, 覆蓋率 !=品質,但基本上把不需要測試的settor,gettor去掉後,保持line coverage 在75%以上,應該不難。
Complexity
程式的複雜度,採用McCabe 的計算方式
左邊是平均值,右邊的chart圖是統計值,統計有兩個view,可以從class的角度或從method的角度來看(建議)
x軸是複雜度,y軸是數量,在本例中:
複雜度為1的method約有600個
複雜度為2的method約有180個
複雜度為4的method約有100個
…
以method為計算單位的建議值
Cyclomatic Complexity |
Risk Evaluation |
中文解釋 |
1 to 10 |
a simple program, without very much risk |
method夠簡單,風險低 |
11 to 20 |
a more complex program, moderate risk |
method有點複雜,有點風險 |
21 to 50 |
a complex, high risk program |
method很複雜,高風險 |
> 50 |
an un-testable program (very high risk) |
只有上帝跟原開發者才懂的method(也許過個月後,只有剩上帝懂) |
Chidamber & Kemerer
左邊的chart圖是LCOM4(Lack of cohesion of methods),右邊是RFC(Response for class) LCOM4是用來判別類別是否具有太多的責任的指標,一般來說,類別設計應該符合單一責任原則 ,如果一個類別之中的methods,並沒有共同的參數或是公用的field,那表示此類別可能可以進行切割。
LCOM4的說明文章 LCOM4的chart圖x軸是LCOM4的值,y軸是class的數量
LCOM4 = 1 好的類別,表示類別只有一個責任
LCOM4 >= 2 可能需進行切割的類別,數字表示可以切割的數量
LCOM4 = 0 空類別
上圖中,LCOM4=3,每一個區域表示可以被獨立切割的部份
RFC的chart圖x軸是RFC的值,y軸是class的數量,RFC的值愈小愈好,
0~50建議值
> 50 表示該類別太過複雜
這個chart圖,通常會搭配Dependency Structure Matrix (DSM)(依赖结构矩阵)
Comments & Duplications
左邊是程式註解的數量,右邊是程式重覆(copy & paste code)的數量
Package design
左邊的Package tangle index是指package糾纏指標,右邊的Dependencies to cut是指有多少個packages需要做依賴性切割
Package tangle index的值愈小愈好
0%最佳值
100%最差值
Dependencies to cut的值愈小愈好,理想值為0
只要圖中消除紅底白色的部份,就可以有效降低Package tangle index
Size metrics
左邊的Lines of code(loc)是程式數量的統計,右邊的classes是類別內容的統計