Sonar

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í):

  1. confirm 確認(rèn)一個(gè)問題,從open變成confirm。
  2. false positive 在全文中查看發(fā)現(xiàn)不是一個(gè)真正的問題,標(biāo)記false positive。
  3. won‘t fix 可以被接受的技術(shù)債。
  4. change severity 根據(jù)自己的經(jīng)驗(yàn)來調(diào)整嚴(yán)重等級(jí)。
  5. 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ù)雜度依次增加。

  1. class 類的平均復(fù)雜度
  2. file 文件的平均復(fù)雜度
  3. method 函數(shù)的平均復(fù)雜度

documentation

  1. line 包含注釋或注釋代碼的行數(shù)。不包括僅有注釋符號(hào)的行數(shù)。
  2. comment(%) 注釋行數(shù)密度=注釋行數(shù)/(代碼行數(shù)+注釋行數(shù))*100。
  3. public documented API(%) 公有記錄API密度=(公有的API-公有未記錄的API)/公有API*100。
  4. public undocumented API 不帶注釋頭的公有API
  5. commented-out LOC(%) 代碼注釋行數(shù)

severity

  1. blocker 致命的
  2. critical 關(guān)鍵的
  3. major 主要的
  4. minor 微小的
  5. 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)比
例如下圖

image.png

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ò)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容