蔡建軍 任女爾 魏金津
摘要:隨著數(shù)據(jù)中心軟件業(yè)務(wù)的快速發(fā)展,給質(zhì)量控制帶來極大的挑戰(zhàn)。采用Sonar檢測代碼質(zhì)量并開發(fā)擴展插件,按項目和人員兩個維度統(tǒng)計代碼質(zhì)量情況,并集成Metrics,Druid以檢測代碼執(zhí)行時的邏輯調(diào)用情況。通過建立好的評價體系,可以很好地提升內(nèi)部軟件代碼質(zhì)量管理的水平,加強對軟件代碼質(zhì)量的在軟件開發(fā)各個階段的掌控。
關(guān)鍵詞:Sonar;Metrics;Druid
中圖分類號:TP311 ? ? ? ?文獻標識碼:A
文章編號:1009-3044(2019)14-0195-05
1 概述
數(shù)據(jù)資源中心軟件業(yè)務(wù)的快速發(fā)展,帶來了軟件框架異構(gòu)多樣、軟件資產(chǎn)復(fù)用率低的問題,更有代碼質(zhì)量參差不齊等帶來的一系列軟件可讀性和維護性問題,傳統(tǒng)的依靠人力的代碼質(zhì)量檢測工作已經(jīng)難以為繼。所以需要構(gòu)建一套自動化,完整高效的代碼質(zhì)量評價體系,將開發(fā)人員的工作質(zhì)量進行量化和評級,用以提高軟件項目開發(fā)過程中的代碼質(zhì)量和軟件部署之后的可維護性。
從軟件工程方法學(xué)進行統(tǒng)籌思考,著眼于軟件工程中對于軟件代碼質(zhì)量評價的幾個重要指標:代碼漏洞、BUG、壞味道、SQL語句平均執(zhí)行時間、函數(shù)平均調(diào)用時間等,結(jié)合Sonar的代碼質(zhì)量統(tǒng)計功能,對Sonar插件進行擴展開發(fā),按項目、人員兩個維度統(tǒng)計代碼質(zhì)量增量情況,集成Metrics與Druid以檢測代碼運行時的調(diào)用邏輯,作為評價代碼質(zhì)量的重要指標之一。
依托于成熟的Sonar軟件質(zhì)量監(jiān)測系統(tǒng),構(gòu)建一套科學(xué)的可量化的評價體系,從而達到減少人工工作,提升內(nèi)部軟件代碼質(zhì)量管理的水平,加強對軟件代碼質(zhì)量的在軟件開發(fā)各個階段的掌控,對于科學(xué)管理軟件資產(chǎn),進一步提升軟件復(fù)用率具有非常重要的意義。
2 基于Sonar衡量代碼質(zhì)量
1)Sonar介紹
軟件行業(yè)內(nèi)常將Sonar作為技術(shù)債務(wù)【1】管控的主流工具。Sonar是一個開源的代碼質(zhì)量分析平臺,能夠管理代碼的質(zhì)量,通過掃描代碼,可以檢測到代碼的漏洞和潛在的編碼層次的邏輯問題【2】。
Sonar的插件機制可以集成不同的工具,如代碼分析、持續(xù)集成,我們還可以開發(fā)插件對檢測結(jié)果進行再加工處理。
2)Jenkins集成Sonar
持續(xù)集成(CI)是個簡單重復(fù)勞動,由人來操作費時費力,使用自動化集成技術(shù)能夠節(jié)約大量的人力。將持續(xù)集成Jenkins與代碼自動掃描集成【3】,能夠自動對代碼進行持續(xù)的代碼規(guī)范掃描,并輸出掃描結(jié)果。即使代碼進行更改,持續(xù)集成技術(shù)也能夠自動觸發(fā)Sonar進行掃描,這對開發(fā)人員進行代碼漏洞及規(guī)范掃描的幫助作用是非常明顯的。
3)衡量代碼質(zhì)量的意義
代碼質(zhì)量,是衡量系統(tǒng)質(zhì)量的重要指標。基于Sonar的掃描功能,構(gòu)建一套軟件代碼質(zhì)量評價體系,定期對系統(tǒng)內(nèi)的項目進行統(tǒng)計分析,有利于及早發(fā)現(xiàn)問題,更好地掌控軟件開發(fā)過程,做到問題早發(fā)現(xiàn)早解決,避免問題滯后導(dǎo)致的技術(shù)債務(wù)越滾越多的惡性循環(huán),有利于提高代碼質(zhì)量監(jiān)管能力,節(jié)約代碼質(zhì)量管理人力,提升整體的代碼質(zhì)量水準。
3 軟件開發(fā)質(zhì)量統(tǒng)計機制
1)基于Sonar的代碼質(zhì)量檢測體系
借助于Sonar所支持的代碼質(zhì)量檢測機制,能夠檢測出項目中存在的一些問題,包括但不限于:可能存在的漏洞、安全問題、代碼壞味道等。
這些統(tǒng)計數(shù)據(jù)可以非常直觀地表現(xiàn)出一個工程的代碼質(zhì)量好壞,可以作為統(tǒng)計代碼質(zhì)量的量化指標。通過這些代碼中發(fā)現(xiàn)的代碼質(zhì)量問題,我們不僅可以避免工程交付后,運行過程中出現(xiàn)致命性的問題,而且可以提高軟件開發(fā)人員的工作規(guī)范,避免在日后的開發(fā)工作中再次出現(xiàn)類似的問題。
Sonar在6+的版本上增加了對“作者”的支持。作者的概念是:在版本控制系統(tǒng)中(如SVN,Git),某個文件的最后一次提交者即是當(dāng)前文件的作者。
在Sonar中,檢測出來的代碼問題分為以下幾種:1、提示級;2、次要級;3、主要級;4、嚴重級;5、阻斷級。其嚴重程度依次遞增,提示級對代碼的整體運行幾乎沒有任何影響,而阻斷級可能會產(chǎn)生各種嚴重的影響,甚至影響系統(tǒng)運行的穩(wěn)定性和安全性。因此,越是高級的問題將會帶來更大的威脅,也就意味著代碼的質(zhì)量越差,系統(tǒng)越不完善。
在有了作者這個概念之后,使對每一位參與開發(fā)的開發(fā)者進行各自的代碼質(zhì)量統(tǒng)計以及工作量統(tǒng)計成了可能。Sonar會記錄當(dāng)前項目下每一位作者的所有問題數(shù)量。對每一位參與開發(fā)的開發(fā)者,通過判斷他所編寫的代碼中所包含的代碼質(zhì)量問題(Bug、漏洞、壞味道等),構(gòu)建一個合理的評價體系,對每位開發(fā)者的代碼質(zhì)量進行評分??梢宰鳛樵u估該開發(fā)者開發(fā)質(zhì)量的一個重要指標。
2)Sonar登錄驗證
在Sonar提供的完備的代碼質(zhì)量統(tǒng)計結(jié)果的前提下,以代碼質(zhì)量統(tǒng)計體系標準為原則,構(gòu)建代碼統(tǒng)計質(zhì)量對比體系??紤]到代碼迭代周期,決定以月度為最小比較單位,上設(shè)季度對比。
Sonar對外提供了一些必要的接口,比如獲取一個項目的issue數(shù)量,代碼行數(shù)統(tǒng)計等基本信息,但是Sonar并不提供歷史掃描信息,只是管理每個issue的狀態(tài)變化信息。所以想要直接通過Sonar的接口獲取到我們希望得到的對比統(tǒng)計數(shù)據(jù)是不可能的。
在調(diào)研了Sonar的接口之后,決定采用定時任務(wù)的方式,將當(dāng)天最新的Sonar掃描結(jié)果進行保存,并記錄保存的日期,以此作為按照周期進行統(tǒng)計的基礎(chǔ)。
首先,通過Sonar提供的登錄接口“api/authentication/login”進行Sonar后臺的登錄,此處為了保證能夠獲取到所有Sonar中的項目,應(yīng)該以管理員權(quán)限登錄,或者使用至少對所有項目具有可見權(quán)限的帳號進行后續(xù)操作。這一步的登錄操作是為了獲取授權(quán)Token,是后面所有獲取統(tǒng)計數(shù)據(jù)的基礎(chǔ)。
3)按照項目進行對比-代碼問題
在Sonar中,每個被檢測的項目有其唯一的、可由用戶指定的ProjectKey來進行標識。這個項目掃描后的各項結(jié)果,均可以通過這個ProjectKey以及對應(yīng)的接口進行獲取。
這里根據(jù)上述的代碼質(zhì)量統(tǒng)計體系,重點關(guān)注上圖中紅線框出來的部分。這部分Sonar的接口因為集成了太多功能,所以僅僅列出本系統(tǒng)所使用的部分接口文檔:
通過調(diào)用Sonar接口“api/issues”,可以獲得各個等級的issue數(shù)量,接口返回的示例如下:
之后,將獲得的這些數(shù)據(jù),保存到數(shù)據(jù)庫中,作為當(dāng)天的掃描結(jié)果,用于后面按照固定周期的比對工作。
4)按照項目進行對比-代碼問題
Sonar系統(tǒng)中保存了代碼行數(shù)的相關(guān)度量,包括代碼總行數(shù),有效代碼行數(shù),注釋行數(shù)和注釋率等,如下圖所示:
Sonar也提供了獲取代碼行數(shù)度量的接口,但是根據(jù)需求,需要收集后臺(JAVA語言)的代碼行數(shù)和全部的度量。全部的度量上圖即可獲得,但是JAVA語言的代碼并不能直接通過接口獲得。獲取全部代碼行數(shù)度量的接口是“api/measures”,通過這個接口可以獲取到代碼行數(shù)掃描的歷史記錄,我們?nèi)∽罱粭l的檢測記錄并保存到數(shù)據(jù)庫中。用于后面生成各項統(tǒng)計數(shù)據(jù)。下面是示例返回:
從上面接口的返回值可以看出,Sonar確實不會分別統(tǒng)計后臺(JAVA)代碼行數(shù)和全部的代碼行數(shù)。我們在調(diào)研了Sonar的接口之后,發(fā)現(xiàn)了可以分文件來統(tǒng)計代碼,下面是系統(tǒng)中使用到的接口描述:
使用這個接口返回的數(shù)據(jù)是一個大的文件掃描結(jié)果列表,列表中每一個節(jié)點中存儲的數(shù)據(jù)都是一些可被自定義的度量,在這個功能模塊中,我們通過它來獲取這個文件中的代碼(如果是代碼文件的話)是由什么語言編寫的,以及這個文件的代碼行數(shù)相關(guān)度量,主要是總代碼行數(shù),有效代碼行數(shù),注釋行數(shù)這三個值,根據(jù)文件中代碼的編程語言判斷是否是JAVA語言,如果是,則分別統(tǒng)計上面三個值的和,最后通過這三個值來計算代碼注釋率。
API接口返回的數(shù)據(jù)示例如下(一個節(jié)點):
5)按照作者進行對比-代碼問題
這個部分和上述的代碼行數(shù)統(tǒng)計部分十分類似。它們都具有共同的現(xiàn)狀:Sonar本身不對作者產(chǎn)生的issue進行統(tǒng)計。而且根據(jù)需求,系統(tǒng)需要統(tǒng)計某個作者在所有他參與的項目中所編寫的代碼質(zhì)量。Sonar的作者的概念是建立在項目這個基礎(chǔ)上的,涉及跨項目的作者,Sonar本身并不支持,所以這里需要有一個前提:
Sonar所檢測的項目所處的SCM管理系統(tǒng)為統(tǒng)一平臺,即每個作者在這個SCM平臺下有且僅有唯一的ID(用戶名)與之對應(yīng)。
在這個前提下,可以通過用戶名將同一個作者不同項目下的代碼問題連接到一起,是統(tǒng)計個人代碼質(zhì)量的基礎(chǔ)。
通過對Sonar接口的調(diào)研,Sonar統(tǒng)計某個作者的問題是在項目中才有統(tǒng)計的,但是通過上述的前提條件,保證了作者名的唯一性,那么就可以通過掃描所有Sonar項目中的作者以及他們的各個等級的問題的數(shù)量,然后通過他們的作者名進行組織,統(tǒng)計出一個同一個作者名下,所有他參與的項目的代碼質(zhì)量問題統(tǒng)計評價。
獲取所有Sonar掃描的項目的ProjectKey的接口是“api/components”,通過這個接口,不需要傳入任何參數(shù)即可得到所有Sonar掃描過的ProjectKey,接口返回數(shù)據(jù)示例如下:
根據(jù)獲取到的所有ProjectKey,分別去該項目下按照issue列表來統(tǒng)計issue所在文件的作者,issue的等級,作為該作者在該項目下的統(tǒng)計數(shù)量,并對作者列表中有該作者的項目所統(tǒng)計出的issue數(shù)量進行合并,作為該作者所有項目的issue數(shù)量統(tǒng)計。返回結(jié)果示例:
圖中三個箭頭分別指向了issue的等級,所屬的項目和作者名,根據(jù)這些信息,不斷迭代所有項目的所有issue,可以統(tǒng)計出作者的issue數(shù)量和等級。將這些數(shù)據(jù)保存在數(shù)據(jù)庫中,用作后面的周期性統(tǒng)計使用。
6)代碼質(zhì)量按周期統(tǒng)計
在經(jīng)過上面的流程,數(shù)據(jù)庫中每天應(yīng)該存有以下數(shù)據(jù):每個Sonar中掃描的項目的各個等級的issue的數(shù)量、評分和評級;每個作者所有的各個等級的issue數(shù)量、評分和評級。根據(jù)需求,需要對月度信息和季度信息進行統(tǒng)計,包括同比和環(huán)比。
選擇的依據(jù)是:選擇月度信息時,按照時間區(qū)間從當(dāng)月1號0點0分開始,到下月1號0點0分為止的時間段內(nèi),按照掃描時間(日期)進行降序排列,以排序后,第一條記錄為基準進行同比,環(huán)比比較。季度信息同上。
7)代碼質(zhì)量統(tǒng)計模塊的使用與導(dǎo)出
首先需要成功部署Sonar插件以及Vue前端。從Sonar主頁進入需要查看代碼質(zhì)量的項目主頁,在“More”(更多)下拉菜單中,選擇“項目監(jiān)控信息展示”:
倒計時過后,會跳轉(zhuǎn)到各項信息展示的頁面:
默認顯示第一個標簽頁,標題為“代碼質(zhì)量統(tǒng)計”,該標簽頁顯示的是代碼質(zhì)量問題合計,主要是各個級別的問題數(shù)量統(tǒng)計。
該標簽頁下方顯示的是代碼行數(shù)檢測結(jié)果,顯示了項目總行數(shù),注釋代碼行數(shù),有效代碼行數(shù),注釋率等指標。
進入第二個標簽頁,會顯示代碼質(zhì)量歷史對比信息:
在這個頁面中,首先展示出來的是該項目的按照月度和季度的對比信息,分別展示了本月最后一條記錄、和上月對比的環(huán)比記錄以及和去年本月對比的同比記錄。按照季度對比也是同樣,展示了環(huán)比和同比的記錄。
在頁面下部,展示的是該項目下,每個作者的issue數(shù)量統(tǒng)計以及對比結(jié)果:
分別展示了該項目下,每個作者的當(dāng)前月(季度)issue數(shù)量和評級評分信息,以及同比和環(huán)比數(shù)據(jù)。
在統(tǒng)計結(jié)果導(dǎo)出的部分,由于考慮到權(quán)限的設(shè)置,將入口設(shè)置在了Administration的頁面中,只有通過admin帳號登錄才能看到入口:
單擊統(tǒng)計結(jié)果導(dǎo)出,在倒計時結(jié)束之后即可自動開始下載數(shù)據(jù)導(dǎo)出表格。數(shù)據(jù)導(dǎo)出表格示例如下:
Excel表格文件中有多個表單(Sheet),從左到右分別展示的是:所有項目按照月度進行統(tǒng)計對比的結(jié)果,所有項目按照季度進行統(tǒng)計對比的結(jié)果,每個項目每個作者的issue數(shù)量按照月度進行統(tǒng)計對比的結(jié)果,每個項目每個作者issue數(shù)量按照季度進行統(tǒng)計對比的結(jié)果,每位作者所有項目按照月度進行統(tǒng)計對比的結(jié)果以及每位作者所有項目按照季度進行統(tǒng)計對比的結(jié)果。
4基于Metrics與Druid分析代碼執(zhí)行效率
Metrics【4】和Druid【5】作為項目運行時的監(jiān)控工具,將之集成進Sonar插件,與Sonar統(tǒng)計出來的各項代碼質(zhì)量問題一起,作為評價代碼質(zhì)量的重要指標之一。
4.1 基于Metrics分析代碼執(zhí)行效率
1)什么是Metrics
Metrics可以監(jiān)控和統(tǒng)計系統(tǒng)或服務(wù)運行時的物理性能(CPU,內(nèi)存,IO等資源占用率)以及業(yè)務(wù)性能(每秒請求數(shù),平均請求響應(yīng)時間等)。Java有很多流行的庫,可以在系統(tǒng)中集成并監(jiān)控。
2)Metrics分析
進行Metrics分析的前提是需要有檢測結(jié)果的csv文件供分析,所以為了將Metrics分析功能和Sonar進行結(jié)合,需要通過腳本轉(zhuǎn)移Metrics監(jiān)測結(jié)果文件到指定的文件夾下。
3)Metrics顯示結(jié)果
Metrics使用“projectKey”來作為項目的唯一標識,“projectKey”對應(yīng)的是sonarqube中唯一標識每個項目的主鍵。通過代碼質(zhì)量檢測頁面的Metrics統(tǒng)計子頁面可以看到檢測的結(jié)果,數(shù)據(jù)表左側(cè)顯示的時執(zhí)行業(yè)務(wù)邏輯的方法名稱,以及方法所在的路徑。右側(cè)mean time是方法的平均執(zhí)行時間, 最后是對這個方法執(zhí)行效率的評分。
4.2 基于Druid分析代碼執(zhí)行效率
阿里巴巴開源的Druid數(shù)據(jù)庫連接池,可以很好地監(jiān)控數(shù)據(jù)庫連接池連接和SQL的執(zhí)行情況,對于打開監(jiān)控統(tǒng)計功能的項目,我們也可以通過Sonar插件集成Druid的Sql執(zhí)行效率分析功能。
Druid的配置項保存在數(shù)據(jù)庫表當(dāng)中,每個“projectKey”對應(yīng)的“druidURL”是運行中的druid項目的監(jiān)控后臺地址,需要通過其接口獲取各種數(shù)據(jù)并統(tǒng)計。我們只需在頁面配置每個項目的druidURL字段里指定具體的url信息即可。進入Druid的統(tǒng)計頁面如圖所示,數(shù)據(jù)表左側(cè)指明執(zhí)行的SQL語句,并有SQL執(zhí)行次數(shù),執(zhí)行總時間,平均時間以及對每條SQL做的評分。
5 總結(jié)
Sonar是技術(shù)債務(wù)管控的主流工具,可以檢測代碼質(zhì)量問題,開發(fā)Sonar插件可以擴展檢測功能,按項目和人員維度統(tǒng)計代碼質(zhì)量包括增量情況,集成Metrics與Druid可以檢測代碼運行時邏輯。建立科學(xué)的可量化的評價體系,可以提升內(nèi)部軟件代碼質(zhì)量管理的水平,加強對軟件代碼質(zhì)量的在軟件開發(fā)各個階段的掌控。
參考文獻
[1] 劉亞珺,李兵,李增揚,等.軟件集成開發(fā)環(huán)境的技術(shù)債務(wù)管理研究[J].計算機科學(xué),2017,44(11):15-21.
[2] 肖漢.一種基于UML的Java類復(fù)雜性度量方法[J].計算機應(yīng)用研究,2007(7).
[3] 趙晨煜.基于大數(shù)據(jù)技術(shù)的O2O電商用戶數(shù)據(jù)挖掘探討[J].中國戰(zhàn)略新興產(chǎn)業(yè),2018(12).
【通聯(lián)編輯:朱寶貴】