sonar 掃描代碼并不是一件很容易的事。
為什么這么說呢,出結(jié)果出報(bào)告,相對(duì)來說很容易,但是誰去follow,誰是owner,優(yōu)先級(jí)等等,背后是一個(gè)組織,而且是一個(gè)高效、認(rèn)同、執(zhí)行力強(qiáng)的組織。所以還是慎入。
整理下sonar相關(guān)的信息。
sonar key point
code viewer
核心是代碼審查,展示代碼源文件和高層次的數(shù)據(jù)。
-> 行數(shù)
-> 問題數(shù)
-> 單元覆蓋率
-> 重復(fù)度
-> SCM信息(近期提交代碼某行代碼的人和時(shí)間)
-> 給定測(cè)試文件的測(cè)試結(jié)果,執(zhí)行時(shí)間和狀態(tài)
coverage
coverage中有三種顏色標(biāo)記:紅色表示沒有被覆蓋;橙色表示部分覆蓋;綠色表示完全覆蓋。Jacoco還可以顯示覆蓋特定一行不同測(cè)試的數(shù)量,同時(shí)也能列出這些測(cè)試,并定位出這些測(cè)試的文件。
duplications
重復(fù)代碼的行數(shù)并定位。重復(fù)密度=重復(fù)行數(shù)/總行數(shù)*100
tests
可以查詢哪個(gè)文件被單元測(cè)試覆蓋,以及有多少行代碼被測(cè)試覆蓋。
issues
issues有5個(gè)等級(jí):
- confirm 確認(rèn)一個(gè)問題,從open變成confirm。
- false positive 在全文中查看發(fā)現(xiàn)不是一個(gè)真正的問題,標(biāo)記false positive。
- won‘t fix 可以被接受的技術(shù)債。
- change severity 根據(jù)自己的經(jīng)驗(yàn)來調(diào)整嚴(yán)重等級(jí)。
- resolve 修復(fù),修改正確,下次狀態(tài)就會(huì)關(guān)閉,否則狀態(tài)仍然開放。
dispositioning
討論決定由誰來解決問題,默認(rèn)為最后一個(gè)提交代碼的人。
general
在issue生命周期中,都可以備注注釋,在運(yùn)行日志中顯示細(xì)節(jié)注釋。
bulk change
所有的這些變更都可以一次性做成多個(gè)問題,通過使用問題搜索結(jié)果面板的Bulk Change。
complexity
基于代碼路徑數(shù)量計(jì)算復(fù)雜度。功能控制流分裂,復(fù)雜度依次增加。
- class 類的平均復(fù)雜度
- file 文件的平均復(fù)雜度
- method 函數(shù)的平均復(fù)雜度
documentation
- line 包含注釋或注釋代碼的行數(shù)。不包括僅有注釋符號(hào)的行數(shù)。
- comment(%) 注釋行數(shù)密度=注釋行數(shù)/(代碼行數(shù)+注釋行數(shù))*100。
- public documented API(%) 公有記錄API密度=(公有的API-公有未記錄的API)/公有API*100。
- public undocumented API 不帶注釋頭的公有API
- commented-out LOC(%) 代碼注釋行數(shù)
severity
- blocker 致命的
- critical 關(guān)鍵的
- major 主要的
- minor 微小的
- info 未知的
maintainability
code smells 既不算bug,也不在脆弱性里。
new code smells
maintainability Rating:A=0-0.05, B=0.06-0.1, C=0.11-0.20, D=0.21-0.5, E=0.51-1
technical Debt:技術(shù)債,修復(fù)所有維護(hù)問題的成本。
technical Debt on new code:新代碼上的技術(shù)債
technical Debt Ratio:技術(shù)債比例=修復(fù)成本/開發(fā)成本
technical Debt Ratio on new code:開發(fā)者變更代碼的花費(fèi)與相關(guān)問題的花費(fèi)比
例如下圖

bugs
A = 0 Bug
B = at least 1 Minor Bug
C = at least 1 Major Bug
D = at least 1 Critical Bug
E = at least 1 Blocker Bug
上圖中coverage的百分比
Coverage = (CT + CF + LC)/(2*B + EL),其中
CT = 條件判斷中至少一次true
CF = 條件判斷中至少一次false
LC = 代碼覆蓋的行數(shù)
B = 條件總數(shù)
EL = 執(zhí)行的總數(shù)
在實(shí)踐過程中有時(shí)會(huì)遇到統(tǒng)計(jì)不出覆蓋率,需要配置jacoco。
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${plugin.jacoco.version}</version>
<configuration>
<destFile>${sonar.jacoco.reportPath}</destFile>
</configuration>
<executions>
<execution>
<id>agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
執(zhí)行跑測(cè)試的代碼邏輯。
mvn clean jacoco:prepare-agent install -Dmaven.test.failure.ignore=true -Dcontent.validation.skip=true -Dsettings.security=${MAVEN_SECURITY_PATH} jacoco:report -e -B -nsu
下面是掃描的mvn 命令。
-Dsonar.branch=${ArtifactionVersion} sonar:sonar -Psonar-dev -e -nsu
當(dāng)然掃描完之后,正如開頭說的,需要發(fā)給相關(guān)關(guān)聯(lián)人去看,當(dāng)然也包括boss了。然后我們可以把sonar分析出來的結(jié)果放在郵件中,可以采用selenium截屏的方式,截出指定位置的圖片。親測(cè)效果不錯(cuò)。