定義
1983年美國IEEE計算機學會對“軟件可靠性”作出了明确定義,此後該定義被美國标準化研究所接受為國家标準,1989年中國也接受該定義為國家标準。該定義包括兩方面的含義:
(1)在規定的條件下,在規定的時間内,軟件不引起系統失效的概率;
(2)在規定的時間周期内,在所述條件下程序執行所要求的功能的能力;
其中的概率是系統輸入和系統使用的函數,也是軟件中存在的故障的函數,系統輸入将确定是否會遇到已存在的故障(如果故障存在的話)。
越難保證
用軟件系統規模越做越大越複雜,其可靠性越來越難保證。應用本身對系統運行的可靠性要求越來越高,在一些關鍵的應用領域,如航空、航天等,其可靠性要求尤為重要,在銀行等服務性行業,其軟件系統的可靠性也直接關系到自身的聲譽和生存發展競争能力。
特别是軟件可靠性比硬件可靠性更難保證,會嚴重影響整個系統的可靠性。在許多項目開發過程中,對可靠性沒有提出明确的要求,開發商(部門)也不在可靠性方面花更多的精力,往往隻注重速度、結果的正确性和用戶界面的友好性等,而忽略了可靠性。在投入使用後才發現大量可靠性問題,增加了維護困難和工作量,嚴重時隻有束之高閣,無法投入實際使用。
與硬件
軟件可靠性與硬件可靠性之間主要存在以下區别:
1.最明顯的是硬件有老化損耗現象,硬件失效是物理故障,是器件物理變化的必然結果,有浴盆曲線現象;軟件不發生變化,沒有磨損現象,有陳舊落後的問題,沒有浴盆曲線現象。
2.硬件可靠性的決定因素是時間,受設計、生産、運用的所有過程影響,軟件可靠性的決定因素是與輸入數據有關的軟件差錯,是輸入數據和程序内部狀态的函數,更多地決定于人。
3.硬件的糾錯維護可通過修複或更換失效的系統重新恢複功能,軟件隻有通過重設計。
4.對硬件可采用預防性維護技術預防故障,采用斷開失效部件的辦法診斷故障,而軟件則不能采用這些技術。
5.事先估計可靠性測試和可靠性的逐步增長等技術對軟件和硬件有不同的意義。
6.為提高硬件可靠性可采用冗餘技術,而同一軟件的冗餘不能提高可靠性。
7.硬件可靠性檢驗方法已建立,并已标準化且有一整套完整的理論,而軟件可靠性驗證方法仍未建立,更沒有完整的理論體系。
8.硬件可靠性已有成熟的産品市場,而軟件産品市場還很新。
9.軟件錯誤是永恒的,可重現的,而一些瞬間的硬件錯誤可能會被誤認為是軟件錯誤。
總的說來,軟件可靠性比硬件可靠性更難保證,即使是美國宇航局的軟件系統,其可靠性仍比硬件可靠性低一個數量級。
軟件差錯
軟件差錯是軟件開發各階段潛入的人為錯誤:
1.需求分析定義錯誤。如用戶提出的需求不完整,用戶需求的變更未及時消化,軟件開發者和用戶對需求的理解不同等等。
2.設計錯誤。如處理的結構和算法錯誤,缺乏對特殊情況和錯誤處理的考慮等。
3.編碼錯誤。如語法錯誤,變量初始化錯誤等。
4.測試錯誤。如數據準備錯誤,測試用例錯誤等。
5.文檔錯誤。如文檔不齊全,文檔相關内容不一緻,文檔版本不一緻,缺乏完整性等。
從上遊到下遊,錯誤的影響是發散的,所以要盡量把錯誤消除在開發前期階段。
錯誤引入軟件的方式可歸納為兩種特性:程序代碼特性,開發過程特性。
程序代碼一個最直觀的特性是長度,另外還有算法和語句結構等,程序代碼越長,結構越複雜,其可靠性越難保證。
開發過程特性包括采用的工程技術和使用的工具,也包括開發者個人的業務經曆水平等。
除了軟件可靠性外,影響可靠性的另一個重要因素是健壯性,對非法輸入的容錯能力。
所以提高可靠性從原理上看就是要減少錯誤和提高健壯性。
三個要素
1.規定的時間
軟件可靠性隻是體現在其運行階段,所以将“運行時間”作為“規定的時間”的度量。“運行時間”包括軟件系統運行後工作與挂起(開啟但空閑)的累計時間。由于軟件運行的環境與程序路徑選取的随機性,軟件的失效為随機事件,所以運行時間屬于随機變量。
2.規定的環境條件
環境條件指軟件的運行環境。它涉及軟件系統運行時所需的各種支持要素,如支持硬件、操作系統、其它支持軟件、輸入數據格式和範圍以及操作規程等。不同的環境條件下軟件的可靠性是不同的。具體地說,規定的環境條件主要是描述軟件系統運行時計算機的配置情況以及對輸入數據的要求,并假定其它一切因素都是理想的。有了明确規定的環境條件,還可以有效判斷軟件失效的責任在用戶方還是研制方。
3.規定的功能
軟件可靠性還與規定的任務和功能有關。由于要完成的任務不同,軟件的運行剖面會有所區别,則調用的子模塊就不同(即程序路徑選擇不同),其可靠性也就可能不同。所以要準确度量軟件系統的可靠性必須首先明确它的任務和功能。
可靠性測試
測試目的
軟件可靠性測試的主要目的有:
(1)通過在有使用代表性的環境中執行軟件,以證實軟件需求是否正确實現。
(2) 為進行軟件可靠性估計采集準确的數據。估計軟件可靠性一般可分為四個步驟,即數據采集、模型選擇、模型拟合以及軟件可靠性評估。可以認為,數據采集是整個軟件可靠性估計工作的基礎,數據的準确與否關系到軟件可靠性評估的準确度。
(3)通過軟件可靠性測試找出所有對軟件可靠性影響較大的錯誤。
測試特點
軟件可靠性測試不同于硬件可靠性測試,這主要是因為二者失效的原因不同。硬件失效一般是由于元器件的老化引起的,因此硬件可靠性測試強調随機選取多個相同的産品,統計它們的正常運行時間。正常運行的平均時間越長, 則硬件就越可靠。軟件失效是由設計缺陷造成的,軟件的輸入決定是否會遇到軟件内部存在的故障。
因此,使用同樣一組輸入反複測試軟件并記錄其失效數據是沒有意義的。在軟件沒有改動的情況下,這種數據隻是首次記錄的不斷重複,不能用來估計軟件可靠性。軟件可靠性測試強調按實際使用的概率分布随機選擇輸入,并強調測試需求的覆蓋面。軟件可靠性測試也不同于一般的軟件功能測試。
相比之下,軟件可靠性測試更強調測試輸入與典型使用環境輸入統計特性的一緻,強調對功能、輸入、數據域及其相關概率的先期識别。測試實例的采樣策略也不同,軟件可靠性測試必須按照使用的概率分布随機地選擇測試實例,這樣才能得到比較準确的可靠性估計,也有利于找出對軟件可靠性影響較大的故障。
此外,軟件可靠性測試過程中還要求比較準确地記錄軟件的運行時間,它的輸入覆蓋一般也要大于普通軟件功能測試的要求。
對一些特殊的軟件,如容錯軟件、實時嵌入式軟件等,進行軟件可靠性測試時需要有多種測試環境。這是因為在使用環境下常常很難在軟件中植入錯誤,以進行針對性的測試。
測試效果
軟件可靠性測試是軟件可靠性保證過程中非常關鍵的一步。經過軟件可靠性測試的軟件并不能保證該軟件中殘存的錯誤數最小,但可以保證該軟件的可靠性達到較高的要求。從工程的角度來看,一個軟件的可靠性高不僅意味着該軟件的失效率低,而且意味着一旦該軟件失效,由此所造成的危害也小。一個大型的工程軟件沒有錯誤是不可能的,至少理論上還不能證
明一個大型的工程軟件能沒有錯誤。因此,保證軟件可靠性的關鍵不是确保軟件沒有錯誤,而是要确保軟件的關鍵部分沒有錯誤。更确切地說,是要确保軟件中沒有對可靠性影響較大的錯誤。這正是軟件可靠性測試的目的之一。軟件可靠性測試的側重點不同于一般的軟件功能測試,其測試實例設計的出發點是尋找對可靠性影響較大的故障。
因此,要達到同樣的可靠性要求,可靠性測試比一般的功能測試更有效,所花的時間也更少。另外, 軟件可靠性測試的環境是具有使用代表性的環境,這樣,所獲得的測試數據與軟件的實際運行數據比較接近,可用于軟件可靠性估計。
總之, 軟件可靠性測試比一般的功能測試更加經濟和有效,它可以代替一般的功能測試,而一般的軟件功能測試卻不能代替軟件可靠性測試,而且一般功能測試所得到的測試數據也不宜用于軟件可靠性估計。
注意問題
軟件可靠性測試一般可分為四個階段:制定測試方案,制定測試計劃,進行測試并記錄測試結果,編寫測試報告。
制定測試方案時需要特别注意被測功能的識别和失效等級的定義。制定測試計劃時需設計測試實例,決定測試時要确定輸入順序,并确定程序輸出的預期結果,這時也需注意測試覆蓋問題。
1. 功能識别
軟件可靠性測試的第一步就是進行功能識别,确定使用剖面。功能識别的目标是:識别所有被測功能以及執行這些功能所需的相關輸入,識别每一個使用需求及其相關輸入的概率分布。為達到第一個目标,需要分析軟件功能的所有集合,這些功能之間全部的約束條件,功能之間的獨立性、相互關系和相互影響,還需分析系統的不同運行模式、失效發生時系統重構策略等對軟件運行方式有較大影響的因素。
第一個目标也是一般軟件功能測試需要達到的目标,但第二個目标則是軟件可靠性測試特别強調的。為了得到能夠反映軟件使用的有代表性的概率分布,測試人員必須和系統工程師、系統運行分析員和顧客共同合作。需要指出的是,由于可靠性的要求,輸入數據的概率分布應包括合法數據的概率分布和非法數據的概率分布兩部分。有時為了更好地反映實際使用狀況,還需給出那些影響程序運行方式的條件,如硬件配置.負荷等的概率分布。
2. 定義換效等級
定義失效等級主要是為了解決下面兩個問題:
對發生概率小但失效後危害嚴重的功能需求的識别。
對可不查找失效原因、并不做統計的功能需求的識别。
在制定測試計劃時,失效及其等級的定義應由測試人員、設計人員和用戶共同商定,達成協議。
3. 可靠性測試覆蓋
可靠性測試必須保證輸入覆蓋和環境覆蓋,這是準确估計軟件可靠性的基礎。
輸入覆蓋包括下面幾個内容:
輸入域覆蓋,即所有被測輸入值域的發生概率之和必須大于軟件可靠度的要求。
重要輸入變量值的覆蓋。
相關輸入變量可能組合的覆蓋,以确保相關輸入變量的相互影響不會導緻軟件失效。
設計輸入空間與實際輸入空間之間區域的覆蓋,即不合法輸入域的覆蓋。
各種使用功能的覆蓋。
環境覆蓋是指測試時必須覆蓋所有可能影響程序運行方式的條件。
測試步驟
軟件可靠性測試分為四個階段:
1.制訂測試方案
本階段的目标是識别軟件功能需求,觸發該功能的輸入和對應的數據域,确定相關的概率分布及需強化測試的功能。
以下是我們推薦的步驟。在一些特定的應用中,有的步驟并不是必須的。
(1)分析功能需求 分析各種功能需求, 識别觸發該功能的輸入及相關的數據域(包括合法
與不合法的兩部分)。分析時要注意下述問題:
該軟件是否存在不同的運行模式?如果存在,那麼應列出所有的系統運行模式。
是否存在影響程序運行方式的外部條件?如果存在,那麼有多少?它們的影響程度如何
各種功能需求之間是相互獨立的還是相關的?如果相關,是密切相關還是部分相關?如果兩種功能密切相關,那麼可将兩種功能合并為一種功能。如果功能之間為部分相關,則需列出相應輸入變量的合法組合。
(2)定義失效等級
判斷是否存在出現危害度較大的1級和2級失效的可能性。如果這種可能性存在,則應進行故障樹分析,标識出所有可能造成嚴重失效的功能需求和其相關的輸入領域。
(3)确定概率分布
确定各種不同運行方式的發生概率,判斷是否需要對不同的運行方式進行分别測試。如果需要,則應給出各種運行方式下各數據域的概率分布;否則,給出各數據域的概率分布。
判斷是否需要強化測試某些功能。
(4)整理概率分布的信息 将這些信息編碼送入數據庫。
2.制訂測試計劃
(1)根據前一階段整理的概率分布信息生成相對應的測試實例集,并計算出每一測試實例預期的軟件輸出結果。
本階段需要注意:在按概率分布随機選擇生成測試實例的同時,要保證測試的覆蓋面。
(2)編寫測試計劃,确定測試順序,分配測試資源。由于本階段前一部分的工作需要考慮大量的信息和數據,因此需要一個軟件支持工具,建立數據庫,并産生測試實例。另外,有時預測軟件輸出結果也需要大量的計算,有些複雜的軟件甚至要用到仿真器模拟輸出結果。總之,具體實施與被測應用軟件的實際功能類型有關。
3. 測試
本階段進行軟件測試。需注意的是被測軟件的測試環境(包括硬件配置和軟件支撐環境
)應和預期的實際使用環境盡可能一緻,對某些環境要求比較嚴格的軟件(如嵌入式軟件)則應完全一緻。測試時按測試計劃和順序對每一個測試實例進行測試,判斷軟件輸出是否符合預期結果。測試時應記錄測試結果、運行時間和判斷結果。如果軟件失效,那麼還應記錄失效現象和時間,以備以後核對。
4.編寫測試報告
按軟件可靠性估計的要求整理測試記錄,并将結果寫成報告。
軟件可靠性測試的關鍵在于:
對需求、輸入、數據域的識别及相關概率分布的确定。
按照概率分布随機生成測試實例,并确定測試順序。
據國外有關文獻報導,這種測試方法已成功應用于大量應用軟件的可靠性測試,包括一些商用軟件和航空、航天電子設備中嵌入式軟件的測試,其效果很好。因此,我們有必要投入一定的人力、物力,針對我們的實際需要,有目的地對各類應用軟件進行軟件可靠性測試,從實踐中逐步積累經驗。同時需要軟件開發方和使用方共同合作,進行軟件可靠性測試方法的研究和有關支持工具的開發,促進我國軟件可靠性水平的提高。
評測技術
軟件可靠性評測是指運用統計技術對軟件可靠性測試和系統運行期間采集的軟件失效數據進行處理并評估軟件可靠性的過程。軟件可靠性評測的主要目的是測量和驗證軟件的可靠性,當然實施軟件可靠性評測也是對軟件測試過程的一種完善,有助于軟件産品本身的可靠性增長。
軟件測試者可以使用很多方法進行軟件測試,如按行為或結構來劃分輸入域的劃分測試,純粹随機選擇輸入的随機測試,基于功能、路徑、數據流或控制流的覆蓋測試,等等。對于給定的軟件,每種測試方法都局限于暴露一定數量和一些類别的錯誤。通過這些測試能夠查找、定位、改正和消除某些錯誤,實現一定意義上的軟件可靠性增長。但是,由于它們都是面向錯誤的測試,測試所得到的結果數據不宜用于軟件可靠性評估。
軟件可靠性測試是指在軟件的預期使用環境中,為進行軟件可靠性評估而對軟件實施的一種測試。軟件可靠性測試應該是面向故障的測試,以用戶将要使用的方式來測試軟件,每一次測試代表用戶将要完成的一組操作,使測試成為最終産品使用的預演。這就使得所獲得的測試數據與軟件的實際運行數據比較接近,可用于軟件可靠性估計。
軟件可靠性評測由可靠性目标的确定、運行剖面的開發、測試的計劃與執行和測試結果的分析與反饋等四個主要的活動組成。
可靠性目标是指客戶對軟件性能滿意程度的期望。通常用可靠度、故障強度、MTTF等指标來描述,根據不同項目的不同需要而定。建立定量的可靠性指标需要對可靠性、交付時間和成本進行平衡。為了定義系統的可靠性指标,必須确定系統的運行模式,定義故障的嚴重性等級,确定故障強度目标。
為了對軟件可靠性進行良好的預計,必須在軟件的運行域上對其進行測試,首先定義一個相應的剖面來鏡像運行域,然後使用這個剖面驅動測試,這樣可以使測試真實的反映軟件的使用情況。由于可能的輸入幾乎是無限的,測試必須從中選擇出一些樣本,即測試用例,測試用例要能反映實際的使用情況,反映系統的運行剖面。
将統計方法應用到運行剖面開發和測試用例生成,在運行剖面中的每個元素都被定量地賦予一個發生概率值和關鍵因子,然後根據這些因素分配測試資源、挑選和生成測試用例。在這種測試中, 優先測試那些最重要或最頻繁使用的功能,釋放和緩解最高級别的風險,有助于盡早發現那些對可靠性有最大影響的故障,以保證軟件的按期交付。一個産品有可能需要開發多個運行剖面,這取決于它所包含的運行模式和關鍵操作,通常需要為關鍵操作單獨定義運行剖面。
在軟件的開發過程中使用軟件可靠性測試和利用軟件可靠性測試對最終産品進行評價,在測試計劃的制定上有所不同。用于設計過程的可靠性測試稱為可靠性增長測試,測試與故障的排除聯系在一起,一般安排在開發過程的系統測試階段執行,将測試所确定的故障提交給開發者進行修改,建立軟件的一個新的版本,再進行下一次測試。
在這種“測試—排錯—新版本”的叠代過程中,跟蹤故障強度的變化,确認測試是否可以終止及軟件是否可以發布。可靠性增長測試的測試腳本将執行多次。針對最終産品的可靠性測試稱為可靠性驗證測試,通過驗證測試可确定軟件産品當前的可靠性水平。就單個軟件版本而言,可靠性驗證測試的測試腳本将僅執行一次。
軟件可靠性故障數據的收集是測試活動的一部分,在測試周期内,紀錄每個故障的資料,如與時間相關的故障頻度、類型、嚴重性和故障的根源等,并且應區分設計階段和最終産品的故障。
可靠性增長測試和可靠性驗證測試将從不同的角度理解故障數據。在可靠性增長測試中,測試以叠代的方式進行,根據測試期間跟蹤到的故障,使用基于軟件可靠性增長模型和統計推理的可靠性評估程序進行故障強度的估計,并用于跟蹤測試的進展情況。可靠性驗證測試是軟件系統提交前進行的最後測試。
它是最終檢驗而不是調試。在驗證測試中,其目标是确定一個軟件組件或系統在風險限度内是被接受還是被拒絕。驗證測試使用可靠性示圖,故障被繪制在圖上。根據它落入的區域,來決定被測軟件是被接受還是被拒絕,或者繼續進行測試。可以根據不同的客戶風險(接受一個不良程序的風險)和供應商風險(拒絕一個好程序的風險)級别構造圖表。



















