邵明正,齊劍鋒,韓 震
SHAO Mingzheng1,QI Jianfeng1,HAN Zhen2
1.軍械工程學院 信息工程系,石家莊050003
2.軍械工程學院 裝備指揮與管理系,石家莊050003
1.Information Engineering Department,Ordnance Engineering College,Shijiazhuang 050003,China
2.Equipment Command and Management Department,Ordnance Engineering College,Shijiazhuang 050003,China
軟件可靠性直接關系到計算機系統(tǒng)乃至更復雜的系統(tǒng)能否在給條件下完成指定任務,不可靠的軟件引發(fā)的失效可能給軟件的使用者或者軟件開發(fā)人員帶來災難性的后果。軟件可靠性的重要性不言而喻,其相關理論也得到了快速的發(fā)展。
廣泛意義上的可靠性工程發(fā)展至今已經有了完善的理論體系及有效的工程實踐方法,相比之下,軟件可靠性工程還處于初級階段,尚有大量的問題需要研究。軟件可靠性的理論及方法最初源于硬件的可靠性[1-2],不可否認這種一致性有利于軟硬結合系統(tǒng)的可靠性綜合評估,但是軟件的固有特性及其與硬件之間的本質差別又決定了它與硬件可靠性的差別。將軟件可靠性理論完全建立在硬件的基礎上并不能從根本上解決軟件可靠性相關的問題。軟件與硬件本來是同一層次的概念,其可靠性理論應該有各自的基礎,目前軟件可靠性大部分的評估方法并不沒有充分考慮軟件產品的特點,而只是從宏觀的角度去描述,其估計方法也難以為用戶理解使用。
軟件可靠性工程是一項系統(tǒng)性的工程,對可靠性的分析貫穿于軟件開發(fā)使用的各個階段[2],而用戶關心的主要是產品運行階段的可靠性,此階段的可靠性不呈現(xiàn)出增長特性。本文基于這樣的思考,首先分析了軟件與硬件可靠性的區(qū)別,指出了軟件失效與硬件故障本質上的一致性;然后從用戶的角度出發(fā),提出了一種基于軟件功能路徑的可靠性評估方法,并分析了時間因素在軟件可靠性中的影響;最后給出了這種評估方法的工程應用步驟。
可靠性的概念經過了很長時間的爭論,雖然現(xiàn)在沒有一個普適的定義,但是以下的定義方式,卻是為大多數(shù)人認可的:產品在規(guī)定的條件下和規(guī)定的時間內,完成規(guī)定功能的能力[3-4]。最初的可靠性理論是以硬件為研究對象的,顯然軟件可靠性的定義繼承了硬件可靠性的理論體系,但是二者還是有著本質的區(qū)別的。
2.1.1 軟硬件可靠性之間的區(qū)別
由于軟件與硬件在固有屬性上的不同,二者之間的可靠性有本質的區(qū)別,具體的表現(xiàn)形式有很多,但原則性的差別歸納起來主要有四個方面,見表1。
從二者的區(qū)別可以看出硬件可靠性是對時間敏感的特性,但是在軟件可靠性上過分強調時間因素的作用是不符合軟件特征的??紤]一個極端的例子:軟件操作界面只有一個按鈕,點擊這個按鈕不會引起軟件故障,且各次單擊之間沒有任何聯(lián)系,那么可以預見無論點擊這個按鈕多長時間,軟件的可靠性也不會發(fā)生變化,始終為1,但是如果是一個鍵盤上的物理按鍵,那么該按鍵的可靠性就與時間有很大關系了。
2.1.2 軟硬件故障產生的一致性
產品的故障如果不進行處理,就會影響其功能的實現(xiàn),也就是產品發(fā)生失效[3]。為了簡化討論,本文主要使用“故障”一詞進行論述,暫不考慮故障出現(xiàn)后的處理。盡管軟件和硬件在失效的根源上是不同的,但是它們發(fā)生故障的本質卻是一致的,即運行狀態(tài)觸發(fā)了產品存在的缺陷,其關系如圖1 所示。這里的缺陷可能是設計時的錯誤,也可能是在使用過程中產生的缺陷。而運行狀態(tài)可能與時間有關,也可能是無關的。仍然以上述的例子加以說明:假如單擊按鈕的次數(shù)會被記錄下來,如果次數(shù)超過1 000 次就會產生數(shù)組下標越界的錯誤。在這里,軟件就存在一個數(shù)組下標越界的軟件缺陷,而單擊第1 000 次時的運行狀態(tài)就會觸發(fā)這個缺陷,產生故障。對于硬件按鈕來說,也許按鈕本身沒有設計缺陷,但是隨著時間的流逝,按鍵彈片發(fā)生了銹蝕,這是在使用過程中產生的缺陷,達到它的強度壽命再按下這個按鈕,就會引起產品故障。
圖1 產品故障產生的一致性
就軟件而言,運行狀態(tài)觸發(fā)缺陷的直接原因是由軟件的操作所引起的[5],而硬件運行狀態(tài)的變化除了使用操作,還包括時間對硬件性能造成的影響。圖2 表示了軟件故障產生的根本過程,將軟件看成是從輸入空間到輸出空間的一種轉變過程。對軟件的操作就是通過不同的輸入數(shù)據(jù)來改變軟件的運行狀態(tài),以期實現(xiàn)正常的功能,而有些輸入可能會激活隱藏在軟件中的缺陷,從而產生故障。
圖2 軟件故障產生的過程
對軟件可靠性的評估一般是根據(jù)軟件可靠性數(shù)據(jù)以統(tǒng)計方法給出軟件可靠性的估計值或預測值[6]。目前已經開發(fā)出近百種方法用于可靠性的評估,而且新的方法還在不斷發(fā)表[7-11,16]。根據(jù)數(shù)據(jù)對象的不同,評估方法可以分為動態(tài)分析方法與靜態(tài)分析方法。動態(tài)分析方法在時間因素的基礎上分析軟件失效的時間與失效的次數(shù)。靜態(tài)分析方法不考慮軟件運行的時間因素,這類方法可以進一步分為缺陷播種、基于數(shù)據(jù)域和基于經驗的方法[5]。表2 列出了幾種典型的軟件可靠性評估方法,表中“√”表示隸屬關系。
表1 軟件與硬件可靠性的主要區(qū)別
表2 典型軟件可靠性評估方法
目前的軟件評估方法與軟件實際存在較大差異,由于各種評估方法都有一定的假設前提,比如假設故障排除是完全獨立的,并不會引起新故障的產生[12],這就限制了評估方法的使用范圍和有效性。不同的軟件類型、同一軟件不同的開發(fā)階段往往需要采用不同的評估方法,到目前為止,并沒有一種普適的軟件可靠性評估方法[2]。由于軟件本身的特性以及獲取有效的可靠性評估數(shù)據(jù)方面的困難,實現(xiàn)完全反映軟件可靠性的方法非常困難。通過2.1 與2.2 節(jié)的分析可知,軟件可靠性從本質上體現(xiàn)的是一種靜態(tài)特性,軟件本身并不會隨時間而變化,所以本文認為分析其可靠性應當從軟件自身的屬性出發(fā),研究其在不同觸發(fā)條件下的運行結果,進而結合統(tǒng)計特征計算軟件的可靠性。
通過上述的分析可知,產品故障的本質是運行狀態(tài)觸發(fā)產品中的缺陷,而軟件故障產生的本質與其是一致的,為了更為清楚地描述軟件的故障本質與其可靠性,從面向用戶使用的角度出發(fā),提出一種便于用戶理解和使用的軟件可靠性的概念。
定義1(運行狀態(tài))軟件在運行過程中,所占有的資源處于不同狀態(tài),稱為軟件不同的運行狀態(tài)。其中資源可以是內存、硬盤、外設等計算機資源。
定義2(操作)使軟件的運行狀態(tài)發(fā)生改變的輸入,并且對它的處理與其他操作有顯著的不同。操作的發(fā)起者可以是用戶、系統(tǒng)本身或外部系統(tǒng)。
定義3(路徑)完成某個功能的一系列操作。
對于操作的概念,處理上明顯的不同是指操作作為一個實體,包含的錯誤在其他操作中是很難出現(xiàn)的。對于一個操作可以有不同的輸入,但這些輸入只屬于一個操作。表3 說明了功能、路徑與操作之間的關系。一個功能可能有多條路徑實現(xiàn),比如功能F2可通過R2、R3兩條路徑實現(xiàn)。而一個操作可能在不同路徑中出現(xiàn),如操作O21分別應用在路徑R2、R3中。一個軟件在功能上是有限的,實現(xiàn)功能的路徑也是有限的,但是操作中的輸入?yún)s可能是無限的,這就導致了在軟件的系統(tǒng)測試中不能實現(xiàn)窮舉測試。
表3 功能、路徑、操作三者之間的關系
把軟件的運行抽象為由節(jié)點和路徑組成的一個網絡,如圖3 所示,其中節(jié)點代表軟件不同的運行狀態(tài),而路徑則表示運行狀態(tài)的轉移,即一系列操作。軟件功能的實現(xiàn)就是按照不同的路徑,達到期望的運行狀態(tài)。軟件出現(xiàn)故障的原因是某些路徑會觸發(fā)軟件固有的缺陷,當軟件狀態(tài)的轉移遇到了這些路徑,便會發(fā)生故障。
圖3 軟件運行狀態(tài)轉移
為了清楚地討論,可以從兩個方面來說明軟件可靠性這個概念,從定性的角度來講,軟件的可靠性可以用其他定量指標來度量,比如軟件可靠度、失效強度、平均故障間隔時間等[13];從定量的角度來講,可靠性本身也可以作為一個定量的指標,比如IEEE對其做出的定義[1]。本文將軟件可靠性和軟件可靠度作為不同的定量指標來描述。
根據(jù)軟件可靠性的特點,可以將軟件可靠度描述為軟件從輸入數(shù)據(jù)計算出正確的輸出數(shù)據(jù)的概率[14]。
由該定義導出它的數(shù)學描述:設非空集合D為軟件的輸入空間,D′為輸出空間。將軟件P看作D上的函數(shù),P*為功能期望函數(shù),則P,P*:D→D′。讓Pr為D上的一個給定的概率分布。當輸入變量為xi時,軟件P在概率分布Pr下相對于功能期望P*的可靠度定義為:
如果軟件的各次輸入是相互獨立的,則軟件在進行n次輸入后的可靠度為:
實際情況要復雜得多,因為軟件的各次輸入之間不能是完全獨立的[15],它們之間可能有著各種各樣的聯(lián)系,輸入的選取也可能是按照一定的順序。而且這樣理論上的表達并不能應用于工程實踐。因此,以此為基礎,借助于路徑、操作的概念建立一種更易理解和使用的可靠性度量方法。
對于用戶來講,軟件在運行上是以完成某些功能為目標的,因此基于用戶的功能需求,通過建立路徑的概念來分析軟件的可靠性。其基本思路如下:
(3)路徑Ri是一個包含有限個元素的操作序列Oi={Oij|j=1,2,…},這些操作是根據(jù)功能需求按照一定的順序選取的,且各路徑操作的個數(shù)不相等。
(4)由于軟件S 本身存在缺陷,某些操作Oe的執(zhí)行會觸發(fā)這些缺陷,路徑不能完成,影響了軟件功能的實現(xiàn),即產生軟件故障。這些不能完成的路徑稱為故障路徑。
一條路徑Ri的完成或產生執(zhí)行故障的過程,稱為軟件S 的一次運行。在實際工作中,用戶往往不會均勻地選擇路徑,而是有的路徑被選擇的概率大,有的路徑被選擇的概率小。這種特定的需求用概率分布pi來描述:pi是路徑Ri從集合R中被選中的概率。路徑Ri執(zhí)行的結果取決于其中操作的結果,更深刻地,操作的結果由操作所涉及的輸入決定,由于輸入的不確定性,操作是否產生故障是隨機性的,所以路徑是否是故障路徑也是有概率的。為了計算軟件運行的故障率,定義路徑故障概率yi,它表示路徑出現(xiàn)故障的可能性。
軟件運行一次出現(xiàn)故障的概率p等于所選路徑出現(xiàn)故障的概率,即
式中,Rel1表示軟件依概率分布pi從R 中選擇一條路徑正確運行的概率,即為運行一次的軟件可靠性,也就是軟件可靠度。那么,軟件連續(xù)運行s次的可靠性為:
接下來考慮,路徑故障概率yi的確定。一條路徑是一個工作序列,路徑中只要有一個操作出現(xiàn)問題,則整條路徑就是故障的路徑。如果路徑Ri中包含k個操作,操作出現(xiàn)故障的概率用Bij來表示,則路徑能成功運行的前提是所有的操作不出現(xiàn)故障,路徑故障概率yi可寫成如下表達式:
于是,軟件可靠度為:
時間對于硬件的影響不僅體現(xiàn)在對硬件的操作上,更重要的是它影響了硬件本身的理化性能。而時間對軟件的影響僅僅體現(xiàn)在操作上,對已經發(fā)布的軟件系統(tǒng)本身沒有影響。
3.3.1 可靠性影響因素分析
軟件可靠度是軟件正確運行一次的概率,從公式(7)中可知,影響軟件可靠度的有:路徑選擇的概率分布pi、操作結果Bij、路徑數(shù)目n及操作數(shù)目k。這些因素都是軟件本身所固有屬性,并不隨時間而產生變化。
而軟件可靠性在一段時間內表現(xiàn)出的是一種累積結果,它是軟件按照功能要求在若干次運行內一直保持正確運行的概率。從公式(5)和公式(6)中可以看出,影響軟件可靠性的主要因素有四個:路徑選擇的概率分布pi、操作結果Bij、路徑數(shù)目n及軟件運行次數(shù)s。其中,Bij和n是由軟件本身所確定的,而pi和s則是由用戶使用所決定。同樣,時間因素對于軟件可靠性并無直接的影響,但是它與運行次數(shù)s有一定的關系。
3.3.2 軟件可靠性與時間的關系
軟件可靠性中的時間更具體的分為執(zhí)行時間和日歷時間,日歷時間更容易為普通用戶所理解[3],因此以日歷時間作為研究對象,設Δt表示軟件運行一次的平均時間,那么軟件運行s次的總時間t=sΔt。則,
圖4 顯示了軟硬件可靠性、可靠度與時間的關系。圖4(a)(c)說明軟件與硬件在一段時間內連續(xù)無故障運行的概率都是隨時間而降低,這是概率累積的結果。但是在可靠度方面,軟硬件分別表現(xiàn)出了不同的特點。圖4(b)圖表示軟件可靠度不隨時間而變化,在任意時刻,軟件獨立運行出現(xiàn)故障的可能性從統(tǒng)計上來講都是一樣的。而硬件在其壽命的不同階段性能會發(fā)生變化,呈現(xiàn)出不同的可靠度。比如硬件在磨合期與正常運行期出現(xiàn)故障的概率是不同的。
圖4 軟硬件可靠性與時間的關系
軟件在使用期間,更能為用戶所理解的時間概念是使命時間[16-17],也就是在特定的時間內完成特定的任務,后一階段的任務是前一階段的重復,比如飛機導航控制軟件,它的任務隨著飛機的每次飛行而呈現(xiàn)階段性的重復,每次飛行時間就可以看作是軟件的使命時間。在軟件的整個生命周期內,不考慮軟件的升級維護,軟件的可靠性會隨著使命時間呈現(xiàn)出周期性的變化,如圖5所示。
圖5 軟件使用周期內的可靠性變化規(guī)律
確定軟件可靠度,需要對軟件進行可靠性測試,以獲得相應的失效數(shù)據(jù),按照一定的評估模型通過概率統(tǒng)計的方法估計出軟件可靠度。測試策略分為代表性隨機測試和非代表性隨機測試兩種[13],本文所提出的模型適用代表性隨機測試的策略。
在實際應用中,基于功能路徑的可靠度評估方法可以按照:功能→路徑→操作→輸入的順序來分析軟件可靠度。由公式(7)知,驗證軟件可靠度需要如下的數(shù)據(jù):路徑選擇的概率分布pi、操作結果Bij、路徑數(shù)目n及操作數(shù)目k。路徑選擇的概率分布pi可以根據(jù)功能區(qū)分來確定;操作結果Bij則需要分析操作的輸入空間,通過測試來估計;路徑數(shù)目n及操作數(shù)目k可以根據(jù)軟件的具體構成得知。測試流程如圖6。
圖6 基于功能路徑的軟件可靠度測試流程圖
根據(jù)軟件實際情況確定每條路徑對應的操作序列,根據(jù)各操作的輸入空間,制定覆蓋全面的測試用例。執(zhí)行測試之后,利用統(tǒng)計出的失效數(shù)據(jù),由公式(7)計算出軟件整體的可靠度。
路徑選擇的概率分布pi、路徑數(shù)目n及操作數(shù)目k可由開發(fā)、測試人員通過分析軟件功能和開發(fā)文檔得到,所以如何確定每個操作的故障率Bij是重點。由于操作涉及的輸入數(shù)量巨大,甚至是無窮的,所以確定操作的故障率需要采用統(tǒng)計分析的方法進行估計。
確定某一操作的故障率的步驟:
第一步:假設該操作的輸入數(shù)量總數(shù)為N個,根據(jù)操作輸入空間的大小,依等價類劃分策略從輸入空間中選取n個輸入。
第二步:針對每一輸入設計相應的測試用例。
第三步:根據(jù)測試用例將軟件進行n次操作,則必定會出現(xiàn)有的輸入產生正確的輸出,有的輸入導致運行故障,每次出現(xiàn)故障時都不排錯,只收集故障數(shù)據(jù)。
以某系統(tǒng)指控軟件的文電子模塊為實驗對象,該模塊設計可實現(xiàn)27 項子功能,依據(jù)不同的操作方法,功能實現(xiàn)路徑有49 條,每條路徑由不同數(shù)量的操作組成。按照4.2 節(jié)所述方法,為每一操作制定測試用例[18],測試并記錄運行結果。部分功能路徑測試結果如表4 所示。
依公式(7)及表3 的數(shù)據(jù),可計算出軟件可靠度Rel1=0.990 4,為了驗證擴展模型的性能,將數(shù)據(jù)進行轉化并結合所記錄時間因素,利用著名的時間域模型J-M 模型求得該子模塊的缺陷個數(shù)為41 個,可靠性Rel=0.932 5。由于本方法對時間因素理解上的不同,使得測試結果與傳統(tǒng)方法有一定出入。從計算過程可以看出,本方法能較為直觀地得到軟件可靠度,對于衡量軟件本身的可靠程度有一定的參考價值。
表4 部分測試結果
軟硬件固有屬性上的差別決定了它們可靠性理論的不同,本文提出的基于功能路徑的可靠性評估方法,從軟件故障產生的根源出發(fā),利用路徑、操作和輸入的概念闡述了軟件可靠性度量方法,該方法具有良好的理論基礎,面向用戶操作,層次清晰、便于使用,適用于軟件使用階段的可靠性驗證。另外,本方法要求測試人員對于軟件的功能路徑要有清晰的把握,了解用戶的使用習慣,如何合理地確定路徑選擇的概率是下一步研究的重點。
[1] 尚珊珊,趙軼群.軟件可靠性綜述[J].軟件導刊,2006,2(8):3-5.
[2] 孫志安,裴曉黎.軟件可靠性工程[M].北京:北京航空航天大學出版社,2009.
[3] Musa J D.軟件可靠性工程[M].韓柯,譯.北京:機械工業(yè)出版社,2003.
[4] 陸文,徐鋒,呂建.一種開放環(huán)境下的軟件可靠性評估方法[J].計算機學報,2010,33(3):352-361.
[5] Munson J C.Software faults,software failures and software reliability modeling[J].Information and Software Technology,1996,38:687-699.
[6] 孫志華.面向多用戶軟件可靠性評估和測試方案研究[J].計算機工程與科學,2004,26(1):70-72.
[7] Wang W L,Pan D,Chen M H.Architecture-based software reliability modeling[J].The Journal of Systems and Software,2006,79:132-146.
[8] Crespo A N,Jino M.A binomial software reliability model based on coverage of structural testing criteria[J].Empire Software Eng,2008,13:185-209.
[9] 樓俊鋼,江建慧,靳昂.考慮軟件不同失效過程偏差的軟件可靠性模型[J].計算機學報,2010,33(7):1263-1270.
[10] 樊林波,吳智,趙明.基于構件的軟件可靠性分析[J].計算機科學,2007,34(5):266-268.
[11] 李海峰,王栓奇,劉暢,等.考慮測試工作量與覆蓋率的軟件可靠性模型[J].軟件學報,2013,24(43):749-760.
[12] Ferneda E,Cornelio N N,F(xiàn)ilho A H.Prediction of software quality based on variables from the development process[J].Lecture Notes in Computer Science,2013,7828(1):78-87.
[13] Jung H,Hong S.The quality control of software reliability based on functionally reliability and usability[J].Lecture Notes in Computer Science,2012,7709(1):119-126.
[14] Palviainen M,Evesti A,Ovaska E.The reliability estimation,prediction and measuring of component-based software[J].Journal of Systems and Software,2011,84(6):112-129.
[15] 朱鴻.軟件可靠性估計與計算復雜性的關系淺析[J].軟件學報,1998,9(9):713-717.
[16] 韓峰巖,覃征,王昕.一種考慮數(shù)據(jù)截尾的非參數(shù)軟件可靠性模型[J].西安交通大學,2006,40(6):667-671.
[17] Huang C Y,Lin C T.Software reliability analysis by considering fault dependency and debugging time lag[J].IEEE Trans on Reliability,2006,55(3):436-450.
[18] 張旭.基于使用剖面的軟件可靠性測試用例生成方法[J].計算機仿真,2009,26(12):66-69.