王一徹,高建華
(上海師范大學(xué) 計算機科學(xué)與技術(shù)系,上海 200234)
軟件可靠性測試是軟件開發(fā)過程中的一個重要環(huán)節(jié),其目的是對軟件的可靠性進行驗證,判斷其是否滿足用戶的需求。如果得到的可靠性滿足需求,則停止可靠性測試,否則,需對軟件中的缺陷進行糾正,提高軟件產(chǎn)品的可靠性。
基于運行剖面的測試在軟件可靠性領(lǐng)域是一種基本的測試方法。傳統(tǒng)方法通過調(diào)試測試找出系統(tǒng)中導(dǎo)致失效的漏洞,而不考慮實際運行中的失效概率,基于運行剖面的測試則把測試用例的概率,即軟件的運行剖面考慮在內(nèi),選擇在實時運行中導(dǎo)致軟件失效的高發(fā)生率輸入,這些輸入對軟件可靠性的影響較大,移除這些漏洞可以極大地提高軟件可靠性。因此,基于運行剖面的測試可有效提高軟件可靠性[3-5],同時,運行剖面測試技術(shù)也被廣泛應(yīng)用于軟件可靠性的評估中[6-7]。例如,文獻[8]將運行剖面測試應(yīng)用于實時嵌入式軟件,文獻[9-10]研究了運行剖面測試與Web應(yīng)用可靠性之間的關(guān)系。此外,運行剖面測試還被應(yīng)用于構(gòu)件軟件系統(tǒng)中[11]。
然而,任何測試選擇技術(shù)都存在飽和點[12],基于運行剖面的測試也一樣,其主要關(guān)注高發(fā)生率的故障,而當軟件需要達到較高的可靠性,即超出了基于運行剖面的測試的臨界點時,需要找到低發(fā)生率的故障(高發(fā)生率導(dǎo)致故障的漏洞已被移除)[13]。因此,基于運行剖面的測試并不適用于需要高可靠性的關(guān)鍵系統(tǒng)中。
文獻[6-7]提出一種基于運行剖面的自適應(yīng)測試策略,通過測試用例的反饋驅(qū)動選擇進行可靠性評估,將軟件測試描述為一個反饋和自適應(yīng)控制問題,并使用一個受控的馬爾科夫鏈來描述測試過程,以最小化可靠性估計的方差。文獻[14]將自適應(yīng)測試與梯度下降法相結(jié)合,其測試結(jié)果優(yōu)于傳統(tǒng)的基于運行剖面的測試。文獻[15]使用置信區(qū)間作為驅(qū)動標準自適應(yīng)地選擇測試用例,以更準確地評估軟件的可靠性。不同的測試技術(shù)可以發(fā)現(xiàn)不同的故障,針對這一特點,可以將不同的測試技術(shù)相結(jié)合,而不是僅使用一種測試方法。文獻[16]把運行測試和調(diào)試測試結(jié)合起來,形成一種混合自適應(yīng)測試技術(shù),文獻[17]將這種混合自適應(yīng)測試技術(shù)應(yīng)用于軟件可靠性的評估。
為了更好地將基于運行剖面的測試技術(shù)應(yīng)用于高可靠性要求的系統(tǒng),本文提出一種基于運行剖面的測試用例分配和選擇方法。該方法在測試用例分配和選擇過程中,通過每一次迭代的結(jié)果對下一次測試進行動態(tài)調(diào)整,以提高測試的有效性。
軟件測試主要包括以下2個步驟:
1)根據(jù)選擇標準,從測試集中選取不同的測試用例進行測試。
2)將得到的輸出結(jié)果與預(yù)期結(jié)果進行比較,如果不一致,則判定軟件發(fā)生失效。
本文把引起軟件失效的測試用例定義為失效點,程序移除錯誤可使許多失效點消失,把這些失效點的集合定義為失效域,失效點數(shù)量占總執(zhí)行測試用例數(shù)量的比例定義為失效率。設(shè)D是待測軟件的輸入域,T為測試用例集,現(xiàn)作如下假設(shè):
1) 運行剖面的劃分依賴于被測試的應(yīng)用軟件[18],測試人員可選擇不同的分區(qū)標準,如根據(jù)功能、結(jié)構(gòu)等進行劃分,把輸入域D分成m個子域,即測試人員的測試目標可決定分區(qū)標準。
2) 假設(shè)每個測試用例只能導(dǎo)致失效或成功,即肯定可以得到運行后的實際結(jié)果,并能夠和預(yù)期結(jié)果進行比較。
3) 每個測試用例都是獨立執(zhí)行的,相互之間沒有影響,即一個導(dǎo)致系統(tǒng)失效的測試用例總是導(dǎo)致失效,而不會被之前執(zhí)行的測試用例影響。
圖1 測試過程
(1)
(2)
其中,ξ是基于采樣的估計分布和真實分布之間的誤差,1-δ是對這種近似的期望,ρ是在第k次迭代中至少有一個測試用例被執(zhí)行的子域數(shù),z1-δ是具有顯著性水平δ的正態(tài)分布,Tk+1即為在k+1次迭代中要執(zhí)行的測試用例數(shù),具體過程如算法1所示。
算法1測試用例分配算法
for i=1 to m
end for
for i=2 to m
end for
//根據(jù)式(2)計算Tk+1
//將測試用例分到每一個子域
i=1;
for j=1 to Tk+1
while rj>bido//找到要分配測試用例的子域
i=i+1;
end while
end for
算法2測試用例選擇算法
for r=1 to g
//從Ni中選擇h個測試用例放入Gr
Ni=Ni-Gr;
end for
for r=1 to g
end for
綜上,本文方法在測試階段通過每一次迭代的結(jié)果對下一次測試進行動態(tài)調(diào)整,是一種自適應(yīng)的測試方法。因此,該方法的效率比傳統(tǒng)的運行測試方法更高。
為了驗證本文方法的有效性,設(shè)計實驗分析以下問題:
問題1在測試過程中各子域概率的變化情況。
問題2與傳統(tǒng)基于運行剖面測試對比的優(yōu)勢。
本文設(shè)計實例并對其進行分析,假設(shè)按照軟件的功能可將其劃分為5個子域,表1給出各子域中測試用例的情況。
表1 子域及其測試用例集
對于問題1,雖然子域D2實際的使用概率只有10%,但其在第1次迭代測試中的失效率較高,相應(yīng)地,該子域的概率向量得到提高,因此,在之后的測試中會對該子域進行更多的測試,而對于上一次迭代沒有出現(xiàn)失效點的子域D1和D5,其概率向量有所減少,在接下來的測試中會減少其比例。若使用傳統(tǒng)的基于運行剖面的方法對表1給定的實例進行測試,其根據(jù)每個子域的運行剖面(即實際使用概率)分配測試,更著重于使用概率大的子域。
對于問題2,傳統(tǒng)的基于運行剖面的測試傾向于使用概率較大的子域D3和D4進行更多測試,本文測試會根據(jù)前一次迭代的測試結(jié)果進行動態(tài)調(diào)整,當子域D3和D4中的故障被移除后,傳統(tǒng)的基于運行剖面測試將難以繼續(xù)提高系統(tǒng)的可靠性,而本文測試將把測試重心轉(zhuǎn)移到那些使用概率較低而失效率較高的子域上,移除其中的故障后可進一步提高系統(tǒng)的可靠性,因此,本文測試方法相比于傳統(tǒng)基于運行剖面的測試具有一定優(yōu)勢。
本文提出一種基于運行剖面的測試用例分配和選擇方法。采用自適應(yīng)的學(xué)習(xí)方法,根據(jù)每次迭代的結(jié)果動態(tài)調(diào)整下一次測試。當高發(fā)生率的故障被移除后繼續(xù)聚焦低發(fā)生率故障,以提高軟件的可靠性。實例分析結(jié)果驗證了該方法的有效性。然而,本文僅給出測試方法有效性的簡單分析,下一步將進行大量實驗驗證,并對相關(guān)定義與假設(shè)部分提出的假設(shè)進行研究,以提高測試的準確性。