劉好斌,梁旗軍,肖 鵬
(南昌航空大學軟件學院,江西 南昌 330063)
軟件可靠性測試用例的主要作用是測試軟件的可靠性,及時發現軟件中存在的漏洞,以便實現對軟件漏洞的及時修復[1]。測試用例的數量隨著軟件規模的擴大不斷增多,增加了軟件可靠性測試的復雜程度,因此,需要對軟件可靠性測試的需求展開分析,通過約簡優化降低測試用例的數量,提高軟件可靠性測試的精度和效率[2]。
魏偉[3]等人通過二元優化覆蓋問題描述軟件可靠性測試用例約簡優化問題,將細胞自動機分類模型引入螢火蟲算法中,利用優化后的算法求解優化問題,實現測試用例的約簡優化。該方法約簡后的測試用例數量多于需求的用例數量,表明方法的約簡結果中存在冗余用例,方法的約簡效果較差。楊祎巍[4]等人結合局部搜索策略與遺傳算法建立測試用例約簡優化模型,采用Memetic算法獲取模型最優解,實現測試用例的約簡優化。該方法約簡軟件可靠性測試用例的運行代價較大,且約簡后的測試用例在軟件可靠性測試過程中出錯概率較高,存在丟失率高的問題。
為了解決上述方法中存在的問題,提出基于耦合度量的軟件可靠性測試用例約簡優化方法。
耦合度量指的是對軟件可靠性測試用例之間依賴程度的度量[5],建立耦合度量模型,度量測試用例之間的依賴程度,具體過程如下:
用七元組表示軟件可靠性測試用例耦合度量模型:
RTC={Fi,Fr,Itc,Yd,Yr,Vn,Fc}
(1)
式中,Fi代表設計軟件可靠性測試用例的思想;Fc代表用戶描述用例的方式;Fr代表設計規則;Vn代表測試步驟在軟件可靠性測試用例中的執行方式和順序;Itc代表單元測試用例在軟件可靠性測試用例中的數量;Yr代表執行測試用例的結果;Yd代表數據在測試用例中的數量;RTC代表軟件可靠性測試用例。
測試用例的權重直接影響耦合度量結果,采用人工方式賦予測試用例權重時,會導致度量結果受主觀因素的影響,度量精度無法得到保證。因此本文通過特征分析法[6-7]計算測試過程中軟件可靠性測試用例的權重。
用m表示耦合資源在軟件可靠性測試用例中的數量,耦合資源表示為I1,I2,…,Im,其權重表示為W1,W2,…,Wm,存在W1+W2+…+Wm=1。采用特征分析法計算軟件可靠性測試用例的具體過程如下:
1)兩兩比較耦合資源,獲得比較結果vij:
(2)
式中,i≥1,j≤m。根據上式計算結果構建比較矩陣V:
(3)
2)用F表示矩陣V對應的最優傳遞矩陣,其表達式如下:
(4)
3)用一致性判斷矩陣R代替矩陣F:
(5)
式中,rij=exp(fij)。
4)針對測試用例的權重,可通過近似解法計算得到,在上述構建的一致性判斷矩陣的基礎上,獲得資源的重要性排序[8-9],即特征向量,分配權重:
①用Q表示每行元素在矩陣R中的乘積,可通過下式計算得到:
(6)
③歸一化處理L=(L1,L2,…,Lm)T,獲得W=(W1,W2,…,Wm),即軟件可靠性測試用例的權重。
通過下述公式計算用例在軟件可靠性測試用例耦合模型中的耦合度TRD:
(7)
式中,T代表用例在模型中的數量;T′代表某類用例在模型中被復用的次數。
針對軟件可靠性測試過程中用例被重復利用的程度采用耦合程度YCRD描述,可通過下式計算得到:
(8)
式中,Wi代表軟件可靠性測試用例中復用資源對應的權重;TRDi代表某類被復用的資源在軟件可靠性測試用例中的復用程度。
設RTCARM代表某段測試時間內,某個用例的多個耦合程度的平均值,其計算公式如下:
(9)
式中,Yi代表軟件可靠性測試用例在測試時間內被復用的次數。
通過上述公式獲得軟件可靠性測試用例的耦合程度,保留耦合度高的軟件可靠性測試用例,對剩余的冗余測試用例展開約簡優化。
選取K個評價指標用于軟件可靠性測試用例的約簡優化,即在優化過程中存在K個決策目標。
首先計算決策目標對應的權重,根據計算結果對決策目標排序H=(h1,h2,…,hk),決策目標可表示為He、Hmax、Hmin,分別表示等值目標、最大目標和最小目標,建立的優化目標函數如下:
(10)
式中,TR代表冗余測試用例集;函數opt的取值情況如下:
1)當Hi∈Hmin時,函數opt表示為hi(tj)≤YVi;
2)當Hi∈Hmax時,函數opt表示為hi(tj)≥YVi;
3)當Hi∈He時,函數opt表示為hi(tj)=YVi。
其中,YVi代表目標對應的閾值。
采用分層序列算法在多目標優化思想的基礎上求解軟件可靠性測試用例約簡優化目標函數,求解思想為:
1)通過耦合度量將軟件可靠性測試用例分為兩類,第一類為冗余測試用例集TR,第二類為耦合測試用例集TE;
2)通過上述建立的目標函數獲取TE的最優解x,設TRk代表用例在軟件可靠性測試過程中的需求構成集合,為了獲取局部最小化的軟件可靠性測試用例,可對TRk展開最小化處理;
3)對上述過程展開迭代,當全部冗余測試需求集Rk被約簡優化后的用例集覆蓋后停止迭代;
用As表示軟件可靠性測試過程中全部的用例集,Os表示原始用例集,Oes表示約簡優化的目標用例集。
約簡軟件可靠性測試用例的具體過程如下:
1)初始化輸入數據,對輸入的用例集展開初始化處理:|As|=m、|Os|=n、|Oes|=k。
2)標記耦合用例集,標記通過耦合度量獲取的耦合用例集合中的冗余用例集。分別用T*和R*表示以上兩個用例集在軟件可靠性測試過程中的需求集。
3)采用蟻群優化算法[10-11]求解軟件可靠性測試用例約簡優化目標函數,獲得TRk,具體過程如下:
(11)
②評價解,計算上述螞蟻構造解對應的適應度函數值。
(1) 在抗滑樁間距為最佳樁間距時,樁后土拱與樁側土拱聯合并存,聯合的土拱可分解為兩個單獨的土拱[14]。
③非支配排序,針對迭代過程中螞蟻構建的解,通過非支配排序方法[12-13]對其展開非支配排序,獲得多個非支配解構成的集合,選取適應度函數值最高的解集,作為軟件可靠性測試用例約簡優化目標函數的最優解集。
④更新解集,比較迭代過程中的最優解集與上述生成的最優解集,保留更好的解集。
⑤更新信息素?ij[14-15]。為了引導螞蟻在迭代過程中向最好的方向移動,需要對信息素?ij展開更新,引入揮發機制減少信息素?ij在搜索路徑中的值,并將優秀的信息素添加到搜索路徑中。
將迭代過程中獲取的最優解集用于信息素?ij的更新,讓最優解集中的解在螞蟻搜索路徑中釋放信息素,信息素?ij的更新過程如下:
?ij=?ij(1-σ)+Δ?ij
(12)
式中,σ代表揮發因子,當Δ?ij的值為1時,表明最優解中存在邊(i,j),當Δ?ij的值為0時,表明最優解中不存在邊(i,j)。
4)在上述過程獲取的TRk中通過層次序列化算法[16]獲取局部最小的軟件可靠性測試用例集。
5)迭代上述步驟,當R*=As時,獲得約簡后的最優軟件可靠性測試用例集。
為了驗證基于耦合度量的軟件可靠性測試用例約簡優化方法的整體有效性,需要對其展開測試。本次測試所用的用例約簡平臺如圖1所示。
圖1 測試用例約簡平臺
針對圖1所示的平臺,現設定軟件可靠性測試過程中需要用例數量為200個,測試用例總數為223個,現采用基于耦合度量的軟件可靠性測試用例約簡優化方法、文獻[3]方法和文獻[4]方法在上述平臺中展開測試。
通過SizeCos表示約簡用例的運行代價,其計算公式如下:
(13)
式中,|V′|代表約簡后用例在軟件可靠性測試過程中的運行代價;|V|代表原始用例在軟件可靠性測試過程中的運行代價。
依據式(13)計算得到三種方法的軟件可靠性測試用例約簡結果,如圖2所示。
圖2 不同方法的用例約簡結果
分析圖2中的數據可知,所提方法可有效將軟件可靠性測試用例的數量約簡為測試需要的用例數量,而文獻[3]方法和文獻[4]方法的約簡結果中存在測試不需要的用例,即冗余用例,表明以上兩種方法的用例約簡效果較差。且對比所提方法、文獻[3]方法和文獻[4]方法的運行代價發現,所提方法的運行代價最小,因為該提方法對軟件可靠性測試用例約簡之前,度量了測試用例的耦合程度,保留耦合程度較高的用例,對剩余的用例展開約簡優化,減少了約簡的用例數量,降低了運行代價。
進一步將丟失率FaultLoss作為評價指標對上述方法展開測試,丟失率越高,表明約簡后測試用例對軟件可靠性測試的錯誤越多,FaultLoss的計算公式如下:
(14)
式中,|F′|代表用例約簡優化后,錯誤測試軟件可靠性的數量;|F|代表原始用例測試軟件可靠性的出錯數量。
所提方法、文獻[3]方法和文獻[4]方法的丟失率測試統計結果,如表1所示。
表1 不同方法的丟失率
由表1中的數據可知,在測試過程中所提方法的丟失率低于其他兩種方法,表明采用所提方法對軟件可靠性測試用例約簡優化后,用例的錯誤測試數量減少,在軟件可靠性測試過程中,所提算法表現出良好的用例約簡能力。
測試用例的數量隨著軟件系統的更新不斷增多,如果不對其處理,會增加軟件可靠性測試的成本,因此在軟件可靠性測試過程中,需要對測試用例展開約簡優化。目前軟件可靠性測試用例約簡優化方法存在約簡效果差、運行代價高和丟失率高的問題,為此提出基于耦合度量的軟件可靠性測試用例約簡優化方法,該方法通過耦合度量獲取用例中的冗余用例,建立用例約簡優化目標函數對冗余用例展開約簡,實驗結果表明,該方法可有效降低用例中存在的冗余用例,且運行代價和丟失率較低,具有良好的應用性能。