郭江峰 曲豫賓
摘 要:在軟件開發(fā)過(guò)程中,軟件缺陷預(yù)測(cè)能預(yù)先識(shí)別存在的潛在缺陷模塊,大幅減少測(cè)試所需的人力、物力,優(yōu)化測(cè)試資源分配,提高測(cè)試效率和軟件產(chǎn)品質(zhì)量。軟件缺陷預(yù)測(cè)技術(shù)不僅具有重要的研究意義,更具有重要的應(yīng)用價(jià)值?;赪eka數(shù)據(jù)挖掘平臺(tái),本研究使用NASA缺陷數(shù)據(jù)集進(jìn)行了軟件缺陷預(yù)測(cè),在合理選擇機(jī)器學(xué)習(xí)算法、科學(xué)設(shè)置參數(shù)的情況下,取得了良好的軟件缺陷預(yù)測(cè)結(jié)果。
關(guān)鍵詞:軟件缺陷預(yù)測(cè);度量元;機(jī)器學(xué)習(xí);Weka
中圖分類號(hào):TP311.52文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1003-5168(2020)08-0014-05
Research and Application of Software Defect Prediction Based on Weka
GUO Jiangfeng1,2 QU Yubin1
(1.Jiangsu College of Engineering and Technology,Nantong Jiangsu 226007;
2.Kizilsu Vocational Technical College,Atushi Xinjiang 845350)
Abstract: In the process of software development, software defect prediction can identify the potential defect modules in advance, greatly reduce the human and material resources needed for testing, optimize the distribution of testing resources, and improve the testing efficiency and software product quality. Software defect prediction technology not only has important research significance, but also has important application value. Based on Weka data mining platform, the software defect prediction was carried out by using NASA defect data set in this study, and good software defect prediction results were obtained under the condition of selecting machine learning algorithm reasonably and setting parameters scientifically.
Keywords: software defect prediction;metrics;machine learning;Weka
隨著科學(xué)技術(shù)和社會(huì)經(jīng)濟(jì)的快速發(fā)展,計(jì)算機(jī)技術(shù)在各個(gè)行業(yè)得到了廣泛應(yīng)用,計(jì)算機(jī)軟件(系統(tǒng))與人們的工作、生活也越來(lái)越緊密,軟件質(zhì)量和系統(tǒng)可靠性對(duì)生產(chǎn)和管理活動(dòng)的效率和安全性的影響也越來(lái)越大[1]。但是,隨著人們對(duì)軟件需求的不斷增長(zhǎng),軟件規(guī)模變大,復(fù)雜程度增加,軟件的開發(fā)與維護(hù)難度越來(lái)越大。隱含缺陷的軟件在運(yùn)行過(guò)程中可能會(huì)產(chǎn)生軟件失效或系統(tǒng)崩潰,嚴(yán)重的軟件缺陷會(huì)給企業(yè)帶來(lái)巨額的經(jīng)濟(jì)損失,甚至可能引發(fā)人員傷亡[1-2]。
用戶需求不明確、軟件開發(fā)過(guò)程不規(guī)范、軟件開發(fā)人員經(jīng)驗(yàn)與能力不足等原因,均會(huì)導(dǎo)致軟件缺陷的產(chǎn)生。為保證軟件質(zhì)量,軟件測(cè)試人員會(huì)通過(guò)一定的軟件測(cè)試方法對(duì)軟件缺陷進(jìn)行排查,然后通知開發(fā)人員對(duì)軟件缺陷進(jìn)行處理。然而,受軟件項(xiàng)目的開發(fā)進(jìn)度和成本控制等實(shí)際因素的影響,軟件測(cè)試工程師無(wú)法對(duì)所有軟件模塊進(jìn)行完全覆蓋測(cè)試。
1 軟件缺陷預(yù)測(cè)的定義與研究意義
隨著人們對(duì)計(jì)算機(jī)軟件的依賴程度越來(lái)越大,如何有效提高軟件質(zhì)量成為軟件工程領(lǐng)域研究的重點(diǎn)和難點(diǎn)。傳統(tǒng)的軟件質(zhì)量保障手段(如靜態(tài)代碼審查或動(dòng)態(tài)軟件測(cè)試)效率低下,需要大量的人力、物力,而且需要額外對(duì)代碼進(jìn)行插樁等修改操作[3]。軟件缺陷預(yù)測(cè)技術(shù)逐漸成為軟件工程領(lǐng)域的研究熱點(diǎn)之一[4-12]。
軟件缺陷預(yù)測(cè),一般是指通過(guò)分析軟件源代碼或開發(fā)過(guò)程,設(shè)計(jì)出與軟件缺陷存在相關(guān)性的度量元,然后對(duì)軟件歷史倉(cāng)庫(kù)進(jìn)行挖掘分析來(lái)創(chuàng)建缺陷預(yù)測(cè)數(shù)據(jù)集?;谌毕蓊A(yù)測(cè)數(shù)據(jù)集,使用特定的建模方法(如機(jī)器學(xué)習(xí))構(gòu)建缺陷預(yù)測(cè)模型,基于預(yù)測(cè)模型對(duì)軟件后續(xù)版本中的潛在缺陷模塊進(jìn)行預(yù)測(cè)分析[13]。
軟件缺陷預(yù)測(cè)能大幅度減少測(cè)試所需的人力、物力,并且無(wú)須額外對(duì)代碼進(jìn)行插樁等修改操作。軟件部署前、模塊開發(fā)結(jié)束后可以及時(shí)開展缺陷預(yù)測(cè),預(yù)先識(shí)別出潛在缺陷模塊,便于項(xiàng)目主管優(yōu)化測(cè)試資源分配,提高測(cè)試效率和軟件產(chǎn)品質(zhì)量。因此,研究軟件缺陷預(yù)測(cè)技術(shù),構(gòu)建軟件缺陷預(yù)測(cè)模型,提前預(yù)測(cè)識(shí)別軟件中的缺陷,不僅具有重要的研究意義,更具有重要的應(yīng)用價(jià)值。
2 軟件缺陷預(yù)測(cè)方法
根據(jù)軟件缺陷預(yù)測(cè)方法的不同,可將其分為靜態(tài)預(yù)測(cè)和動(dòng)態(tài)預(yù)測(cè)[6]。靜態(tài)預(yù)測(cè)主要將軟件代碼量化為靜態(tài)特征,對(duì)這些特征和歷史缺陷信息進(jìn)行統(tǒng)計(jì)分析,挖掘歷史缺陷的分布規(guī)律并構(gòu)建預(yù)測(cè)模型,然后基于預(yù)測(cè)模型對(duì)新的程序模塊進(jìn)行預(yù)測(cè)。動(dòng)態(tài)預(yù)測(cè)則是對(duì)軟件缺陷發(fā)生的時(shí)間進(jìn)行分析,挖掘軟件缺陷與其發(fā)生時(shí)間之間的關(guān)聯(lián)。目前,隨著機(jī)器學(xué)習(xí)算法的廣泛應(yīng)用,靜態(tài)軟件缺陷預(yù)測(cè)不斷取得良好的預(yù)測(cè)結(jié)果,受到了研究者的更多關(guān)注[14-15]。
2.1 軟件缺陷預(yù)測(cè)過(guò)程
軟件缺陷預(yù)測(cè)過(guò)程可分為四個(gè)階段,如圖1所示[16]。
2.1.1 程序模塊抽取。對(duì)軟件歷史倉(cāng)庫(kù)進(jìn)行挖掘分析,從中抽取出程序模塊。程序模塊的粒度可設(shè)置為文件、包、類、函數(shù)等。抽取出模塊后,將這些程序模塊分別標(biāo)記為有缺陷模塊或無(wú)缺陷模塊。
2.1.2 設(shè)計(jì)度量元。基于軟件靜態(tài)代碼或軟件開發(fā)過(guò)程,設(shè)計(jì)相應(yīng)的度量元,通過(guò)這些度量元對(duì)程序模塊進(jìn)行軟件度量,并構(gòu)建出缺陷預(yù)測(cè)數(shù)據(jù)集。
2.1.3 構(gòu)建缺陷預(yù)測(cè)模型。對(duì)缺陷預(yù)測(cè)數(shù)據(jù)集進(jìn)行必要的數(shù)據(jù)預(yù)處理之后,借助特定的建模方法(如機(jī)器學(xué)習(xí)方法)構(gòu)建出軟件缺陷預(yù)測(cè)模型。
2.1.4 缺陷預(yù)測(cè)。使用構(gòu)建好的軟件缺陷預(yù)測(cè)模型對(duì)新程序模塊進(jìn)行預(yù)測(cè)分類,將程序模塊預(yù)測(cè)為有缺陷傾向性模塊或無(wú)缺陷傾向性模塊。預(yù)測(cè)目標(biāo)也可以是程序模塊含有的缺陷數(shù)或缺陷密度。
2.2 度量元設(shè)計(jì)
度量元的設(shè)計(jì)是軟件缺陷預(yù)測(cè)研究中的核心問(wèn)題[17]。典型的度量元包括代碼行數(shù)、McCabe環(huán)路復(fù)雜度和Halstead科學(xué)度量等。將McCabe環(huán)路復(fù)雜度作為度量元主要考慮程序的控制流復(fù)雜度,其假設(shè)條件是如果程序模塊的控制流復(fù)雜度越高,含有缺陷的可能性也越高[18]。將Halstead科學(xué)度量作為度量元主要考慮程序內(nèi)操作符和操作數(shù)的數(shù)量,其假設(shè)條件是如果程序模塊中的操作符和操作數(shù)越多,導(dǎo)致代碼的閱讀難度越大,含有缺陷的可能性越高[19]。
除了基于軟件代碼設(shè)計(jì)度量元之外,部分研究者基于軟件開發(fā)過(guò)程進(jìn)行度量元的設(shè)計(jì)[20-21]?;谲浖_發(fā)過(guò)程主要考慮軟件項(xiàng)目管理、開發(fā)人員經(jīng)驗(yàn)、代碼修改特征等方面?;谀囊环N方式設(shè)計(jì)度量元更能有效構(gòu)建缺陷預(yù)測(cè)模型,研究人員對(duì)此進(jìn)行了比較研究。Graves[22]、Moser[21]等人研究認(rèn)為,基于開發(fā)過(guò)程設(shè)計(jì)出的度量元更為有效。而Menzies[23]等人研究認(rèn)為,基于靜態(tài)代碼的度量元可以構(gòu)建出高質(zhì)量的缺陷預(yù)測(cè)模型。可以看出,兩者并無(wú)明顯的優(yōu)劣之分,合理地設(shè)計(jì)度量元,都能取得良好的預(yù)測(cè)效果。
2.3 缺陷預(yù)測(cè)模型構(gòu)建與應(yīng)用
在構(gòu)建缺陷預(yù)測(cè)模型之前,根據(jù)數(shù)據(jù)集的質(zhì)量,可能需要先進(jìn)行缺陷預(yù)測(cè)數(shù)據(jù)集的預(yù)處理。這是因?yàn)閿?shù)據(jù)集可能存在噪聲、維數(shù)災(zāi)難和類不平衡等問(wèn)題,預(yù)處理可以提高數(shù)據(jù)集的質(zhì)量[24]。
數(shù)據(jù)集經(jīng)過(guò)預(yù)處理后,借助一定的算法來(lái)構(gòu)建缺陷預(yù)測(cè)模型。作為人工智能和數(shù)據(jù)科學(xué)核心的機(jī)器學(xué)習(xí),在軟件缺陷預(yù)測(cè)領(lǐng)域得到了廣泛應(yīng)用,通常被選用為構(gòu)建軟件缺陷預(yù)測(cè)模型的算法。常用于軟件缺陷預(yù)測(cè)的機(jī)器學(xué)習(xí)方法可分為分類方法和回歸方法。分類方法主要包括分類回歸樹、樸素貝葉斯、K-最近鄰、支持向量機(jī)、集成學(xué)習(xí)和聚類分析等;回歸方法主要包括線性回歸、多項(xiàng)式回歸、逐步回歸和彈性回歸等。
使用構(gòu)建的軟件缺陷預(yù)測(cè)模型,就可以對(duì)新數(shù)據(jù)(測(cè)試集)進(jìn)行測(cè)試并得出預(yù)測(cè)結(jié)果,預(yù)測(cè)目標(biāo)可以是模塊內(nèi)是否含有缺陷、含有的缺陷數(shù)量或缺陷密度等。
3 基于Weka的軟件缺陷預(yù)測(cè)應(yīng)用
Weka是由新西蘭懷卡托大學(xué)開發(fā)的數(shù)據(jù)挖掘工具,內(nèi)含了大量的機(jī)器學(xué)習(xí)算法,可以實(shí)現(xiàn)數(shù)據(jù)的預(yù)處理、分類、回歸、聚類、關(guān)聯(lián)規(guī)則以及可視化等功能。
本文試驗(yàn)數(shù)據(jù)采用美國(guó)國(guó)家航空航天局(NASA)缺陷數(shù)據(jù)集。里面包括12個(gè)項(xiàng)目的缺陷數(shù)據(jù)集,其中每個(gè)數(shù)據(jù)集都對(duì)軟件系統(tǒng)中的功能模塊進(jìn)行了標(biāo)記,分別標(biāo)記為有缺陷模塊和無(wú)缺陷模塊。數(shù)據(jù)集的缺陷率為0.78%~35.2%,數(shù)據(jù)集的模塊總數(shù)范圍為125~16 962,數(shù)據(jù)集基本信息如表1所示。
3.1 數(shù)據(jù)集加載與預(yù)處理
在“Preprocess”選項(xiàng)卡中,單擊“Open file”命令按鈕,選擇指定的數(shù)據(jù)集。Weka默認(rèn)的數(shù)據(jù)格式為“*.arff”。
加載完數(shù)據(jù)集后,如果數(shù)據(jù)集中問(wèn)題數(shù)據(jù)較多,則不能直接進(jìn)行數(shù)據(jù)挖掘模型的訓(xùn)練和學(xué)習(xí),必須進(jìn)行數(shù)據(jù)預(yù)處理。數(shù)據(jù)預(yù)處理一般可分為數(shù)據(jù)清理、數(shù)據(jù)集成、數(shù)據(jù)變換、數(shù)據(jù)歸約4個(gè)方面。這些預(yù)處理都可以使用Weka提供的過(guò)濾器(Filter)來(lái)實(shí)現(xiàn),F(xiàn)ilter又可分為非監(jiān)督學(xué)習(xí)和監(jiān)督學(xué)習(xí)兩種過(guò)濾器。
3.2 指定分類器
選擇“Classify”選項(xiàng)卡,點(diǎn)擊“Choose”按鈕,展開“Classifiers”后可以看到bayes、functions、lazy、meta、misc、rules、trees,共7種類型,每種類型又包括多種具體的分類或回歸算法,如圖2所示。鼠標(biāo)左鍵點(diǎn)擊“Choose”按鈕右側(cè)的文本框,出現(xiàn)“GenericObjectEditor”對(duì)話框,可以在對(duì)話框中為各算法指定具體參數(shù),不同的參數(shù)值對(duì)算法性能具有重要影響。
本次試驗(yàn)選擇軟件缺陷預(yù)測(cè)研究中經(jīng)常采用的決策樹法分類器,在圖2中展開“trees”列表,選擇其中的“J48”。
3.3 構(gòu)建軟件缺陷預(yù)測(cè)模型
為評(píng)估軟件缺陷預(yù)測(cè)模型的性能,需要通過(guò)“Test Option”來(lái)指定測(cè)試模式。Weka共提供了4種測(cè)試模式,分別為“Using training set”“Supplied test set”“Cross-validation”和“Percentage split”。
本次試驗(yàn)采用交叉驗(yàn)證模式(Cross-validation)。將“Folds”參數(shù)指定為“10”,即進(jìn)行10折交叉驗(yàn)證。在該參數(shù)設(shè)置下,將數(shù)據(jù)集隨機(jī)劃分為10份,輪流將其中的9份作為訓(xùn)練數(shù)據(jù),剩余1份作為測(cè)試數(shù)據(jù)[16]。循環(huán)10次,取這10次運(yùn)行結(jié)果的平均值作為模型的預(yù)測(cè)性能。
點(diǎn)擊“Start”按鈕,使用訓(xùn)練數(shù)據(jù)對(duì)算法進(jìn)行訓(xùn)練并生成相應(yīng)的預(yù)測(cè)模型。
本次試驗(yàn)生成決策樹模型,如圖3所示。在右側(cè)的“Classifier output”中,顯示用文本表示的決策樹、準(zhǔn)確率及誤差分析等結(jié)果。同時(shí),左下角的“Results list”出現(xiàn)了一個(gè)列表項(xiàng),顯示生成時(shí)間和算法名稱。在分類結(jié)果中,顯示出混淆矩陣,如圖4所示。
通過(guò)混淆矩陣可以看出,缺陷數(shù)據(jù)集中178個(gè)“Defective”屬性被標(biāo)記為有缺陷的模塊,其中104個(gè)被正確預(yù)測(cè)為有缺陷、有74個(gè)被錯(cuò)誤預(yù)測(cè)為無(wú)缺陷。數(shù)據(jù)集中1 201個(gè)“Defective”屬性被標(biāo)記為無(wú)缺陷的模塊,其中,78個(gè)被錯(cuò)誤預(yù)測(cè)為有缺陷,有1 123個(gè)被正確預(yù)測(cè)為無(wú)缺陷。矩陣左上到右下對(duì)角線上的數(shù)字越大,說(shuō)明預(yù)測(cè)的準(zhǔn)確度越好。在結(jié)果列表中,鼠標(biāo)右擊選中結(jié)果項(xiàng),在出現(xiàn)的快捷菜單中選擇“Visualize tree”,可以圖形化顯示生成的決策樹。
3.4 預(yù)測(cè)軟件缺陷
軟件缺陷預(yù)測(cè)模型生成之后,就可以對(duì)待預(yù)測(cè)的數(shù)據(jù)集進(jìn)行預(yù)測(cè)。值得注意的是,待預(yù)測(cè)數(shù)據(jù)集和訓(xùn)練用數(shù)據(jù)集的屬性設(shè)置要保持一致。
在“Test Opion”中選擇“Supplied test set”,點(diǎn)擊“Set”按鈕,在出現(xiàn)的“Test Instances”對(duì)話框中指定要應(yīng)用模型的數(shù)據(jù)集。右鍵點(diǎn)擊“Result list”中剛產(chǎn)生的列表項(xiàng),選擇“Re-evaluate model on current test set”。預(yù)測(cè)模型將對(duì)測(cè)試數(shù)據(jù)集進(jìn)行預(yù)測(cè),結(jié)果顯示在右側(cè)區(qū)域,如圖5所示。可以看出,在選用合適的機(jī)器學(xué)習(xí)算法的基礎(chǔ)上,預(yù)測(cè)正確率達(dá)到了96.12%,效果良好。
4 結(jié)論
軟件缺陷預(yù)測(cè)能預(yù)先識(shí)別出軟件中的潛在缺陷模塊,大幅度減少測(cè)試所需的人力、物力,優(yōu)化測(cè)試資源分配,提高測(cè)試效率和軟件產(chǎn)品質(zhì)量。度量元的設(shè)計(jì)是軟件缺陷預(yù)測(cè)研究中的核心問(wèn)題,設(shè)計(jì)與軟件缺陷存在強(qiáng)相關(guān)性的度量元可以顯著提高預(yù)測(cè)模型質(zhì)量。靜態(tài)軟件缺陷預(yù)測(cè)可基于軟件代碼或者軟件開發(fā)過(guò)程設(shè)計(jì)度量元。人們可以借助Weka數(shù)據(jù)挖掘工具,合理選擇機(jī)器學(xué)習(xí)算法,設(shè)置相關(guān)參數(shù),構(gòu)建出實(shí)用的軟件缺陷預(yù)測(cè)模型,進(jìn)而對(duì)軟件缺陷實(shí)施預(yù)測(cè)。由于不同軟件項(xiàng)目具有不同的開發(fā)流程和編程語(yǔ)言等特性,如何在數(shù)據(jù)集間存在較大差異的情況下提升軟件缺陷預(yù)測(cè)方案的有效性、開展跨項(xiàng)目的軟件缺陷預(yù)測(cè),值得進(jìn)一步的研究。
參考文獻(xiàn):
[1]于巧.基于機(jī)器學(xué)習(xí)的軟件缺陷預(yù)測(cè)方法研究[D].北京:中國(guó)礦業(yè)大學(xué),2017.
[2]沈鵬.基于機(jī)器學(xué)習(xí)的軟件缺陷預(yù)測(cè)方法研究[D].重慶:西南大學(xué),2019.
[3]陳翔,顧慶,劉望舒,等.靜態(tài)軟件缺陷預(yù)測(cè)方法研究[J].軟件學(xué)報(bào),2016(1):1-25.
[4]Kanmani S,Uthariaraj V R,Sankaranarayanan V,et al.Object-oriented software fault prediction using neural networks[J].Information and Software Technology,2007(5):483-492.
[5]Elish K O,Elish M O.Predicting defect-prone software modules using support vector machines[J].Journal of Systems and Software,2008(5):649-660.
[6]王青,伍書劍,李明樹.軟件缺陷預(yù)測(cè)技術(shù)[J].軟件學(xué)報(bào),2008(7):1565-1580.
[7]羅云鋒,賁可榮.軟件故障靜態(tài)預(yù)測(cè)方法綜述[J].計(jì)算機(jī)科學(xué)與探索,2009(5):449-459.
[8]Arisholm E,Briand L C,Johannessen E B.A systematic and comprehensive investigation of methods to build and evaluate fault prediction models[J].Journal of Systems and Software,2010(1):2-17.
[9]Catal C.Software fault prediction:A literature review and current trends[J].Expert Systems withApplications,2011(4):4626-4636.
[10]Hall T,Beecham S,Bowes D,et al.A systematic literature review on fault prediction performance in software engineering[J].IEEE Transactions on Software Engineering,2012(6):1276-1304.
[11]Laradji I H,Alshayeb M,Ghouti L.Software defect prediction using ensemble learning on selected features[J].Information and Software Technology,2015(58):388-402.
[12]Zhang F,Zheng Q,Zou Y,et al.Cross-project defect prediction using a connectivity-based unsupervised classifier[C]//Proceedings of the 38th International Conference on Software Engineering.2016.
[13]陳翔,王莉萍,顧慶,等.跨項(xiàng)目軟件缺陷預(yù)測(cè)方法研究綜述[J].計(jì)算機(jī)學(xué)報(bào),2018(1):254-274.
[14]Menzies T,Greenwald J,F(xiàn)rank A.Data mining static code attributes to learn defect predictors[J].IEEE Transactions on Software Engineering,2007(1):2-13.
[15]Li L,Leung H.Mining static code metrics for a robust prediction of software defect-proneness[C]//Proceedings of the International Symposium on Empirical Software Engineering and Measurement.LosAlamitos,CA:IEEE Computer Society.2011.
[16]陳翔,賀成,王宇,等.HFS:一種面向軟件缺陷預(yù)測(cè)的混合特征選擇方法[J].計(jì)算機(jī)應(yīng)用研究,2016(6):1758-1761.
[17]Radjenovic D,Hericko M,Torkar R,et al.Software fault prediction metrics:A systematic literature review[J].Information and Software Technology,2013(8):1397-1418.
[18]McCabe T J.A complexity measure[J].IEEE Transactions on Software Engineering,1976(4):308-320.
[19]Halstead M H.Elements of Software Science (Operating and Programming Systems Series)[M].New York:Elsevier Science Inc.,1978.
[20]N Nagappan,T Ball.Use of Relative Code Churn Measures to Predict System Defect Density[C]//In Proceedings of the International Conference on Software Engineering.2005.
[21]R Moser,W Pedrycz,G Succi.A Comparative Analysis of the Efficiency of Change Metrics and Static Code Attributes for Defect Prediction[C]//In Proceedings of the International Conference on Software Engineering.2008.
[22]T Graves,A Karr,J Marron,et al.Predicting Fault Incidence using Software Change History[J].IEEE Transactions on Software Engineering,2000(7):653-661.
[23]T Menzies,J Greenwald,A Frank.Data Mining Static Code Attributes to Learn Defect Predictors[J].IEEE Transactions on Software Engineering,2007(1):2-13.
[24]M Shepperd,Q Song,Z Sun,et al.Data Quality:Some Comments on the NASA Software Defect Datasets[J].IEEE Transactions on Software Engineering,2013(9):1208-1215.