呂俊廷
【摘 要】軟件的可測試性表示軟件中的錯誤被檢測出的難易程度,軟件的可信度則表示經(jīng)過測試之后對一個軟件的信任程度,它們都是軟件的重要質(zhì)量特性。本文將極限理論引入到軟件測試過程中,較好的解決了確定軟件的可信度的方法,建立了基于故障的可測試性模型,并利用這個模型給出了軟件可測試度的計算方法。最后,給出了基于故障的可測試性模型在軟件測試過程中的應(yīng)用。
【關(guān)鍵詞】可測試性;可信度;故障;失效;基于故障的可測試性模
軟件的可測試性指在給定任意輸入集合下對軟件進(jìn)行隨機(jī)黒盒測試的過程中,軟件中存在的錯誤被發(fā)現(xiàn)的難易程度??蓽y試度是可測試性大小的度量,指隨機(jī)黒盒測試過程中,軟件錯誤能夠被揭示出來的概率?,F(xiàn)有的可測試性模型,如敏感性分析模型[1]、PIE分析模型[2]、靜態(tài)可測試性度量模型[3]等,都是基于白盒測試的,它們的理論基礎(chǔ)就是軟件的故障/失效(Fault/Failure)模型[4],這個模型介紹了軟件故障導(dǎo)致軟件失效的三個充分必要條件:
1)程序的輸入使這個軟件錯誤得到了執(zhí)行;
2)被執(zhí)行的錯誤使該程序位置之后的數(shù)據(jù)狀態(tài)發(fā)生變化(故障);
3)錯誤的程序數(shù)據(jù)狀態(tài)被傳播到程序輸出,并使輸出結(jié)果錯誤(產(chǎn)生失效)。
各個不同的模型就是針對這三個充分必要條件,采用不同的技術(shù)來獲取它的概率值,如敏感性分析模型和PIE分析模型主要應(yīng)用了插裝變異體的技術(shù),而靜態(tài)可測試性模型則是利用了各種操作符和操作數(shù)的發(fā)生潛在錯誤的概率來計算可測試性,基于錯誤/故障模型的可測試性計算方法要求多次運(yùn)行被測程序,通過觀測變異因子對程序結(jié)果的影響來估計其執(zhí)行概率、傳染概率和傳播概率,進(jìn)而估量程序可測試性度量指標(biāo)值。該過程雖然較為貼近實(shí)際結(jié)果,但通常實(shí)現(xiàn)起來效率比較低下;同時由于該過程需要記錄大量測試過程信息,因而對系統(tǒng)的資源要求也很高。本文試圖建立一種基于軟件測試過程的可測試性度量模型,可測試性的值在軟件的測試過程中,被逐步的修正并隨之應(yīng)用于軟件的測試,使得可測試性分析和軟件測試過程有機(jī)結(jié)合在一起。
軟件的可信度[5]反映了我們對一個軟件的信任程度,一般的,R=,其中Lr表示程序中正確的代碼行數(shù),Lt表示代碼總行數(shù)。問題在于一個軟件經(jīng)過測試之后,軟件中正確的代碼行數(shù)依然是未知的,那么我們能夠在多大程度上信任它,即它的可信度是多少呢?軟件測試的結(jié)果是衡量軟件質(zhì)量的依據(jù),本文將從軟件測試的結(jié)果中給出軟件可信度的計算方法。
1 軟件測試過程的極限模型
給定規(guī)格說明書S,滿足S的正確的程序有無數(shù)個,它們構(gòu)成一個等價類P。我們假定程序經(jīng)過修改后引入的新故障數(shù)小于修正的故障數(shù),對于一個較為成熟的組織,這個假設(shè)是成立的。設(shè)剛完成的未經(jīng)測試的程序?yàn)镻0,
公式(1)為我們在工程上的應(yīng)用奠定了基礎(chǔ),我們無法知道正確的程序到底是什么,但是我們可以很容易的知道程序當(dāng)前的版本和在此之前的版本的差異,后面我們將利用這個差異來確定軟件的可測試度和可信度。
軟件測試過程的極限模型是對程序進(jìn)行多輪測試的過程中所表現(xiàn)出來的規(guī)律,這一點(diǎn)決定了它適合于大型的程序,因?yàn)橹挥写笮偷某绦虿庞锌赡苓M(jìn)行多輪的軟件測試。對于小型的程序來講,由于它的開發(fā)和測試過程受到個人技能因素的影響較大,所以極限模型在小型的程序中的表現(xiàn)并不明顯。
2 基于故障的可測試性模型及其工程化應(yīng)用
2.1 基于故障的可測試性模型
可測試性反映了程序的錯誤在測試過程中暴露的難易程度,可測試性好的程序,它的錯誤容易暴露出來;可測試性差的程序,它的錯誤難于暴露出來。如果錯誤容易暴露出來,我們就認(rèn)為它體現(xiàn)了軟件的優(yōu)良的可測試性方面的信息;如果錯誤隱藏的很深,不容易暴露出來,我們就認(rèn)為這些錯誤則體現(xiàn)了軟件的可測試性差的方面的信息。因此,一個可測試性好的模塊,它的錯誤必然容易發(fā)現(xiàn),不需要執(zhí)行太多的測試用例,在測試的初期就能夠揭示出來;相反,可測試性差的模塊,它的錯誤隱藏的很深,需要執(zhí)行大量的測試用例,到測試的末期甚至直到軟件交付使用后才能將錯誤揭示出來。
根據(jù)上面的分析,我們把軟件的錯誤分為兩類:容易暴露的錯誤和難于暴露的錯誤,那么可測試度就是容易暴露的錯誤的度量占錯誤的總度量的比例,下面將以錯誤的數(shù)量為度量單位進(jìn)行討論,即容易暴露的錯誤數(shù)占軟件中錯誤總數(shù)的比例:
2.2 軟件的可信度度量
在隨機(jī)黒盒測試中,軟件中的錯誤只有當(dāng)以故障的形式表現(xiàn)出來時,我們才能夠發(fā)現(xiàn)并修正它,軟件中的錯誤到底有多少,即使經(jīng)過了大量的測試之后,也是不可知的,因?yàn)檐浖y試只能夠證明軟件中含有錯誤,而無法證明軟件是正確的。雖然軟件故障只是軟件錯誤的表現(xiàn)形式之一,對于工程化的應(yīng)用來講,那些永遠(yuǎn)不能以故障的形式表現(xiàn)出來的軟件錯誤,可以認(rèn)為是正確的,所以對于2.1節(jié)的可測試度公式(2)中的錯誤數(shù),可以用故障數(shù)來代替
那么如何判定一個故障是容易暴露的故障還是難于暴露的故障呢?一個非常直觀的想法就是容易暴露的錯誤必然容易被發(fā)現(xiàn),因此在隨機(jī)黒盒測試的早期就能夠以軟件故障的形式表現(xiàn)出來;難于暴露的錯誤必然隱藏的很深,不容易被發(fā)現(xiàn),因此直到軟件測試的末期,甚至于軟件交付使用之后才被揭示出來?;谶@種思想,我們把隨機(jī)黒盒測試按照時間的順序劃分為若干個階段,用第一階段、第二階段、…來表示,把初始階段測試中發(fā)現(xiàn)的故障數(shù)作為容易發(fā)現(xiàn)的故障數(shù),一般的可以取第一階段
3 基于故障的可測試性模型在軟件測試過程中的應(yīng)用
基于故障的可測試性模型提供了兩個非常有價值的軟件指標(biāo):可信度和可測試度,這兩個指標(biāo)可以指導(dǎo)我們科學(xué)的規(guī)劃軟件測試的進(jìn)度和合理的分配軟件測試過程中資源。下面以p=2為例說明基于故障的可測試性模型在軟件測試過程中的應(yīng)用。
理論上來說,任何一輪測試結(jié)束后都可以計算軟件的可測試度和可信度,但是假定p=2的前提下,第一輪測試結(jié)束后根據(jù)公式(4)是無法計算可信度的,所以p=2就意味著至少進(jìn)行兩輪測試;同理,如果假定p=3,則至少進(jìn)行3輪測試,以此類推。那么兩輪測試結(jié)束之后,可以由公式(4)計算軟件的可信度R,如果R大于給定的軟件的可信度R′,則停止測試;否則,根據(jù)公式(3)計算軟件各個模塊的可測試度,根據(jù)各模塊可測試度的值分配測試資源,即可測試度越小,分配的測試資源越多;可測試度越大,分配的測試資源越少,繼續(xù)進(jìn)行下一輪的測試,直到滿足給定的可信度為止。
可依照如下算法進(jìn)行:
(Ⅰ)選擇p的值,并進(jìn)行p輪測試,得到程序Pp。
(Ⅱ)根據(jù)公式(4)計算程序Pp的可信度R,如果R>R′,則停止測試,程序Pp即可發(fā)布;否則轉(zhuǎn)(3)。其中R′為事先給定的軟件的可信度,是我們對軟件的要求。
(Ⅲ)根據(jù)公式(Ⅲ)計算軟件的各個模塊的可測試度,根據(jù)可測試度的大小分配測試資源,進(jìn)行第p+1輪測試,得到程序Pp+1,轉(zhuǎn)(Ⅱ)。
在上述測試流程中,軟件的可信度和可測試度不斷的進(jìn)行著修正,每進(jìn)行一輪測試就向真值靠近一步,直到達(dá)到我們的要求才停下來。
4 結(jié)束語
本文將極限理論引入到軟件測試中,解決了軟件發(fā)布的時間點(diǎn),即測試結(jié)束的時間點(diǎn)的問題,并在此基礎(chǔ)上建立了基于故障的可測試性模型,給出了基于故障的可測試度計算方法,整個流程如下:
(1)軟件測試以m天為一個階段進(jìn)行,各個階段的測試天數(shù)m可以不同,一個版本測試結(jié)束后,把測試中發(fā)現(xiàn)的故障進(jìn)行修正得到新的編譯版本,由此得到一個程序序列:
(3)計算軟件的可測試度,T=,其中Fo表示第一階段發(fā)現(xiàn)的故障數(shù),F(xiàn)表示測試過程中發(fā)現(xiàn)的故障總數(shù)?;诠收系目蓽y試性模型主要是針對桌面操作環(huán)境下故障發(fā)生的特點(diǎn)提出的,對于網(wǎng)絡(luò)環(huán)境并沒有考慮到,尤其是網(wǎng)絡(luò)環(huán)境下的軟件疲勞問題,可能是本模型的一個盲區(qū),還需要做進(jìn)一步的研究。
【參考文獻(xiàn)】
[1]Jeffrey Voas. Software Testability Measurement for Assertion Placement and Fault Localization[J].Software Quality Journal, 1997,6(5):327-335.
[2]Jeffrey Voas. A Dynamic Failure Model for Predicting the Impact that a Program Location has on the Program[J]. ESEC,1991,550(3):308-331.
[3]Jin-Cherng Lin,Szu-wen Lin&Ian-Ho. An Estimated Method for Software Testability Measurement[J]. Eighth IEEE International Workshop Proceedings on Software Technology and Engineering Practice [Incorporating Computer Aided Software Engineering], 1997,6(6):14-18.
[4]Morell, Larry. A Theory of Fault-based Testing[J]. IEEE Tracsactions on Software Engineering, 1990,16(8):844-857.
[5]宮云戰(zhàn).軟件的測試性分析與設(shè)計[J].裝甲兵工程學(xué)院學(xué)報,2000,1(1):1-5.
[責(zé)任編輯:鄧麗麗]