徐 舜
(武漢輕工大學數學與計算機學院 湖北 武漢 430048)
軟件已經成為各行業不可或缺的基礎設施,影響著人們的生活和工作方式[1]。 然而,隨著軟件規模和復雜性的不斷增加,軟件缺陷和質量問題也日益凸顯。 軟件缺陷作為軟件開發過程中不可避免的一部分,可能導致軟件功能故障、性能下降和安全漏洞,以及存在數據競爭、內存泄漏、性能不優等,給用戶和企業帶來巨大的損失和風險[2]。目前,全球范圍內每年因軟件缺陷而導致的經濟損失高達數百億美元。 在金融領域,由于軟件缺陷而引發的交易延誤和錯誤,可能導致巨大的財務損失。 而在醫療行業,軟件缺陷可能對患者的安全和健康產生嚴重影響[3]。 此外,大規模軟件項目中的缺陷修復工作也往往耗時費力,導致項目延期和成本超支。
因此,軟件質量保證變得至關重要,迫切需要一種有效的方法來預測和識別潛在的軟件缺陷[4]。 與傳統的人工代碼審查和測試相比,機器學習算法在軟件缺陷預測和分析中展現出了巨大的潛力。 通過對歷史軟件項目的數據進行學習和分析,機器學習算法能夠發現隱藏在海量數據中的模式和規律,提前預測可能存在的缺陷,從而幫助開發團隊在軟件交付之前修復問題,提高軟件的質量和可靠性[5]。
本研究旨在利用機器學習算法在軟件缺陷預測中的應用,探索其在軟件質量保證中的作用。 通過收集和分析歷史軟件項目的數據,結合不同的特征提取方法和機器學習算法,將建立一個預測模型,并驗證其在實際軟件項目中的有效性。 通過這項研究的深入探索,可以為軟件開發過程中的缺陷預測提供新的思路和方法,為軟件質量保證工作提供有力的支持。 同時,通過驗證預測模型在實際軟件項目中的有效性,可以為軟件開發人員提供一個可靠的工具,幫助他們更好地進行軟件質量保證工作,提高用戶滿意度。
軟件缺陷預測通過提前發現、修復和預防軟件缺陷,幫助提高軟件質量、節約成本和時間,改進開發過程,能夠有效減少軟件缺陷的風險,提高用戶滿意度[6]。 軟件缺陷預測旨在通過分析和挖掘軟件開發過程中的數據,如代碼版本歷史、缺陷報告、代碼復雜度、代碼質量指標等,來預測軟件中可能存在的缺陷[7]。 這種基于數據驅動的方法能夠更全面地識別潛在的問題,并幫助軟件開發人員在軟件交付之前采取相應的措施。 采用機器學習算法來處理數據,可以分析各種軟件開發數據,并從中學習和挖掘軟件缺陷的模式和規律。 然后,這些算法可以利用這些模式和規律來對新的代碼進行分類,并預測其中可能存在的缺陷。
軟件缺陷預測(software defect prediction, SDP)是一種基于機器學習和數據挖掘技術的方法,用于預測軟件開發過程中潛在的缺陷或錯誤,如圖1 所示。 可以幫助軟件開發人員和測試人員在軟件開發和測試過程中早期發現和修復缺陷的技術。 通過使用機器學習模型,預測模型可以分析從軟件記錄中提取的特征和度量,并將這些信息與之前觀察到的缺陷信息相關聯,以預測未來是否會發生缺陷。 軟件缺陷預測的整個過程可以分為以下幾個步驟。

圖1 軟件缺陷預測過程
第一,收集軟件記錄。 從缺陷跟蹤系統、版本控制系統、代碼審查或電子郵件記錄中獲取軟件記錄。 通過收集軟件記錄,可以獲得關于軟件開發過程中的關鍵信息,包括缺陷、代碼修改、審查意見和團隊溝通等。 這些記錄可以用于分析和改進軟件開發過程,提高軟件質量和開發效率。
第二,創建實例。 實例是從軟件記錄中提取的對象,通常是源代碼文件、類或函數等。 實例由許多度量或特征組成,并標記為缺陷、干凈或缺陷數量。 這些度量和特征可以是代碼靜態和動態分析的結果,也可以是人工定義的特征[8]。
第三,進行預處理。 對實例進行預處理,以便更好地進行機器學習模型的訓練和預測。 預處理通常包括數據清洗、數據歸一化、標記編碼等。 這些預處理步驟能夠提高數據的質量和一致性,使得機器學習模型能夠更好地進行訓練和預測。 在實際應用中,根據數據的特點和具體問題,需要進行適當的調整和組合這些步驟。
第四,訓練模型。 使用機器學習算法來訓練預測模型。 通常,將數據集分為訓練集和測試集。 訓練集用于訓練模型,測試集用于評估模型的性能[9]。 將可用數據集劃分為訓練集和測試集可以幫助評估模型的泛化性能、調整模型參數、驗證模型選擇等。 這也是機器學習中非常重要的步驟之一。
第五,一旦模型完成訓練,我們可以利用該模型來預測新的實例是否存在缺陷,以及預測缺陷的數量。 如果模型預測的缺陷數量較高,這可能意味著代碼存在潛在的問題,需要開發人員進一步檢查和調試。 通過使用訓練得到的模型進行缺陷預測,開發人員可以及時發現和解決潛在的問題,提高代碼的質量和可靠性。
第六,評估模型性能。 使用各種評估指標來評估模型的性能,例如準確率、召回率、F1 得分等。 這些指標可以幫助我們了解模型的預測能力和效果,以及是否需要進一步改進模型。
第七,優化模型。 根據評估結果,對模型進行優化和改進。 可以嘗試不同的特征選擇方法、調整模型參數、嘗試不同的機器學習算法等。
第八,部署模型。 將優化后的模型部署到實際的軟件開發環境中,以實現缺陷預測的自動化和持續集成。 這可以幫助開發團隊及時發現和修復潛在的缺陷,提高軟件質量和穩定性。
極限學習機(extreme learning machine, ELM)是一種基本的單層前向神經網絡,與傳統的反向傳播算法等基于梯度的前饋網絡學習算法不同,ELM 不使用基于梯度的策略。 在該系統中,所有參數一次性調整。 該算法不需要迭代指令。 這種特點可以宣稱,隱藏層的輸入權重和偏置可以隨機選擇,而不需要在決定網絡參數的過程中進行任何改變,這增加了訓練速度并減少了參數調整的時間。
ELM 的工作方式如下:
(1)輸入層和隱藏層:ELM 的輸入層接收輸入數據,隱藏層通過隨機選擇輸入權重和偏置,將輸入數據映射到隱藏層的激活函數上。 ELM 最初使用sigmoid 函數或ReLU 函數作為隱藏層的激活函數。 但是,隨著研究的深入,人們發現其他激活函數,如高斯函數、tanh 函數等,可以在某些情況下提供更好的性能。 因此,一些擴展的ELM 算法允許用戶根據具體問題選擇不同的激活函數。
(2)輸出層:隱藏層的輸出被連接到輸出層,輸出層使用最小二乘法或其他適當的算法來計算輸出權重,通過建立線性方程組以獲得期望的輸出,從而快速建立模型并進行預測。 這種非迭代的訓練過程大大加快了ELM 的訓練速度,并且在許多實際問題中表現出了良好的泛化能力。
(3)訓練過程:ELM 的訓練過程是非迭代的,即只需一次性確定隨機選擇的參數。 隱藏層的權重和偏置以及輸出層的權重可以通過解一個線性方程組得到,這大大加快了訓練速度。 相比于傳統的迭代算法,ELM 能夠在短時間內建立模型并進行預測,這使得它在處理大規模數據集和實時應用中具有一定的優勢。
通過使用ELM 算法,可以快速訓練單層前向神經網絡,從而實現高效的模型訓練。 ELM 算法的特點是簡單且不依賴于梯度下降等迭代過程,這使其具有快速學習速度和較低的參數調整時間。 ELM 在某些應用領域具有廣泛的應用,特別是在大數據和實時處理方面,能夠提供高效的學習和預測能力。
本文采用了Eclipse 程序存儲庫版本控制系統和缺陷跟蹤的數據集,分別針對2.0、2.1 和3.0 版本。 以下是關于這兩個部分數據的簡要總結。
(1)從特定版本的軟件中收集變更日志詳細信息需要收集與該軟件特定版本相關的所有缺陷ID。 將版本控制系統轉換為缺陷56789、r56789 或修補到r5678 是更可取的方式。 缺陷ID 和相關事項包含在這些執行記錄中。如果只獲取包含預測ID 的增加級別,那么數據就不準確,其關鍵是提高結果的可靠性。
(2)根據所獲得的缺陷ID 在版本控制系統中查找基于版本的詳細信息。 報告中任何包含版本的缺陷都涉及到確定缺陷所在的版本。 然而,在軟件的生命周期中,這些細節可能會發生變化。 最終,可能會得到該數據的多個版本。
(3)使用Eclipse 插件Metrics 1.3.6 計算存在的軟件包和文件的軟件度量,并進行預測。 最終數據選擇CSV格式進行存儲。 該文件中每一行都記錄了文件的詳細信息,每個字段之間使用逗號進行分隔。 其中包括組件和文件名,缺陷數量和缺陷數量報告后提供的文件和不同的值。
本文中使用的數據集是基于軟件包的數據集,每個軟件包都有相似的數據文件,每個文件包括發布前的缺陷量、發布后的缺陷量和度量值,本文使用的度量集包括軟件復雜度度量、軟件規模度量和面向對象度量。 在2.0 版本中,基于軟件包的記錄總數為377 條。 在2.1 版本中,基于軟件包的記錄總數為7888 條。 在3.0 版本中,基于軟件包的記錄總數為10593 條。 為了提高有效性,選擇工作更好的分類器,或者使用仿生算法來提供大規模數據。而從數據的角度來看,本文中的樣本規模量可以提供有效的實驗結果[10]。
與傳統的前饋網絡學習算法(如反向傳播算法)不同,ELM 不采用基于梯度的學習策略,所有參數一次性整定,不需要迭代指令,其特點是在確定網絡參數的過程中,輸入權值和隱層偏差可以隨機選擇,而不需要任何改變,提高了訓練速度,減少了參數的調整時間。 ELM 的計算方法具體如公式(1)所示:
式(1)中,L是隱藏單元的數量,N是訓練樣本的數量,w是輸入和隱藏層之間的權重向量,g是激活函數,b是通孔向量,并且x是輸入向量。
本文中使用Python 的Pandas 庫,來構建數據庫以便于進行分析,使用Python 的Scikit-learn 庫來構建一個預測模型,使用Python 構建模型的另一個好處是可以評估和分析這個模型的不同方法,并找到預測目標的最佳模型。
通過設計實驗過程,最終得到的結果如表1 所示。 在該表中,“training”表示訓練數據集,“testing”表示測試數據集,“ACCURARY”表示正確率,“RECALL”表示召回率,“PRECISION”為準確率,“AUC”為ROC 所形成的曲線面積。 根據表1 可得,在整體性能和AUC 方面,Package 3.0模型表現最好。 但是在特定的測試中,其他模型也可能表現出更好的準確率或召回率。

表1 基于軟件包的預測結果ELM 模型
近幾年來,軟件測試在軟件可靠性研究中的地位越來越重要,然而,在軟件測試中,浪費了大量的時間、資源和金錢。 軟件缺陷預測可以幫助提高軟件測試的效率,指導軟件測試資源的直接分配。 本文討論了軟件缺陷預測的定義和流程,提出了軟件缺陷預測的概念。 本文的研究數據來源于Eclipse 軟件開發庫和Eclipse 插件,利用Eclipse、插件計算了基于軟件包的軟件度量,并利用Python 開發了基于ELM 算法的缺陷預測模型,并利用這個模型對軟件包進行了缺陷預測。 實驗結果最終表明,ELM 是比較適合軟件缺陷預測的模型,這將為軟件測試資源預測提供指導。