qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          軟件可靠性測試方法新探

          摘要:針對傳統軟件可靠性測試方法在對軟件因長期使用軟件性能下降,甚至完全失效這種嚴重影響軟件可靠性的測試存在不足的現狀,通過對軟件自身特性以及軟件可靠性估算面臨問題的深入分析和研究,結合傳統的軟件可靠性測試方法,提出了基于操作剖面的軟件可靠性壓力測試思想和操作剖面、壓力測試點相互結合、互為補充的軟件可靠性測試方法,并給出了軟件可靠性測試新方法實施的技術途徑。該思想與方法既是對傳統軟件可靠性測試方法的一個大膽探索,也是對軟件可靠性測試方法的一個有益補充。

            關鍵詞:軟件缺陷;軟件可靠性;壓力測試;

            0、引言

            軟件在計算機發展的不同階段有不同的認識。計算機發展的初期,硬件在計算機應用中起決定作用,而軟件,即程序,甚至是機器指令程序或匯編程序,是處于從屬地位的。軟件開發是以個體手工的方式進行,設計是人的智力行為,軟件質量完全取決于個人的智力和編程技巧。隨著計算機的發展,人們認識到軟件使得計算機的計算能力大大提高,應用能力大大增強。于是在開發計算機應用系統時,硬件和軟件同時考慮,而且開始編制應用支撐程序,如操作系統數據庫等。這時的生產方式是以小作坊的形式進行。到了后來,社會的各種應用需要對計算機提出了更高和更特別的要求,很多大型軟件系統開發的工作量高達數千人年,指令數百萬條或更多,如美國宇航飛船的軟件系統有4000萬條語句。而今,計算機的應用面越來越廣,應用規模越來越大,應用過程越來越復雜,軟件在計算機系統中的比重越來越大,軟件成本在總成本中的比重正在逐年上升,而且這種趨勢還在增加。這時人們感到傳統的軟件生產方式已不適應計算機發展的需要,需要把工程學的基本原理和方法引入到軟件開發過程中,即軟件工程思想。

            事實上,無論計算機技術如何發展,計算機中的軟件是人通過智力勞動產生的,其軟件產品是人的思維結果,是一個邏輯部件,而不是一個物理部件。軟件開發水平很大程度上取決于軟件人員的教育、訓練和經驗的積累。由此軟件具有與硬件或傳統工業產品不同的特點:

            (1)軟件是一種邏輯實體,具有抽象性,人們必須通過觀察、分析、思考、判斷,才能了解它的功能、性能等特性;

            (2)軟件沒有明顯的制造過程,一旦研制開發成功,就可以大量拷貝同一內容的副本。所以對軟件的質量控制,必須在軟件開發方面下工夫;

            (3)軟件在使用過程中,沒有磨損、老化的問題,但為了適應硬件、環境以及需求的變化而進行修改,這些修改常常會引入錯誤,導致軟件失效率升高,軟件質量降低。如果修改成本太高,質量風險太大,軟件就會被拋棄;

            (4)軟件對硬件和環境有著不同程度的依賴性,由此帶來了軟件移植的問題;

            (5)軟件的開發至今尚未完全擺脫手工作坊式的開發方式,生產效率低。這對復雜軟件,特別是今后會更加復雜的軟件帶來了是否能夠控制其復雜性和時效性的問題;

            (6)軟件開發需要投入大量、高強度的腦力勞動,成本非常高,風險也大。現在軟件的開銷已大大超過了硬件的開銷;

            (7)許多軟件的開發和運行涉及機構、體制和管理方式等問題,還會涉及到人們的觀念和心理。這些人的因素,常常成為軟件開發的困難所在,直接影響到項目的成敗。

            基于上述軟件的特性,美國國防部中大量的軟件系統其可靠性得不到保證,幾乎沒有不存在錯誤的軟件系統。盡管人們在軟件開發過程中采用各種軟件工程方法,應用各種軟件測試技術,但他們只能盡量發現錯誤、減少錯誤,卻不可能徹底消除錯誤,無法實現真正意義上的無錯軟件,百分之百的可靠。

            現今計算機硬件技術的發展,使得在計算機系統中的硬件可靠性越來越高,而軟件可靠性的問題變得日益突出。在一些關鍵的應用領域,如航空、航天等,對軟件可靠性的要求尤為重要。如在銀行等服務性行業,其軟件系統的可靠性也直接關系到自身的聲譽和生存發展競爭能力。由于軟件中存在缺陷、錯誤和故障使軟件失效很有可能造成巨大的損失或慘重的災難。研究結果表明:由于軟件開發出現問題引起的系統失效與由于硬件設計或使用引起的失效之比是10:1。由此可見,軟件在計算機系統中占有絕對重要的地位。于是,人們借鑒硬件可靠性理論,提出了“軟件可靠性”概念,不再追求軟件無錯,而以統計的觀點去判斷軟件滿足用戶使用要求的程度。

            1、軟件可靠性

            軟件可靠性借鑒了硬件可靠性的概念,即軟件按規定的條件,在規定的時間內運行而不發生故障的能力。軟件可靠性與硬件可靠性不同的是:軟件可靠性不但與軟件中存在的缺陷有關,而且與系統輸入和系統使用有關。

            從定義上看,評價或測試一個軟件的可靠性,最主要的是要確定系統怎樣輸入、如何使用一整套的方法和策略。另一方面,軟件可靠性是軟件質量特性中重要的固有特性和關鍵因素,軟件可靠性反映了用戶的質量觀點。而軟件的故障是由于軟件的質量存在問題——即它固有的缺陷導致錯誤,進而使系統的輸出不滿足預定的要求,造成系統的故障。所謂按規定的條件主要是指軟件的運行(使用)環境,它涉及軟件運行所需要的一切支持系統及有關的因素。如支持硬件、網絡、操作系統及其它支持軟件、輸入數據、操作規程等。

            盡管當前的軟件可靠性定義借用了硬件可靠性的定義,但事實上軟件可靠性因軟件的特性它與硬件可靠性相比較是有很大的差別的,如:

            (1) 硬件有老化損耗現象,硬件失效是物理故障,是器件物理變化的必然結果。軟件不發生變化,沒有磨損現象,但軟件由于長期使用軟件性能下降,甚至完全失效的故障也是有的。例如,無休止的線程、無釋放的文件鎖閉、數據污染、存儲空間的徹底分裂與積聚差錯等;

            (2) 硬件可靠性的決定因素是時間,受設計、生產、運用的所有過程影響,軟件可靠性的決定因素是與輸入數據有關的軟件差錯,是輸入數據和程序內部狀態的函數,更多地決定于人;

          (3)硬件的糾錯維護可通過修復或更換失效的系統重新恢復功能,軟件只有通過重設計或排除錯誤;

            (4)對硬件可采用預防性維護技術預防故障,采用斷開失效部件的辦法診斷故障,而軟件則不能采用這些技術;

            (5)可靠性預測和可靠性增長等技術對軟件和硬件有不同的意義;

            (6)為提高硬件可靠性可采用冗余技術,而同一軟件的冗余不能提高可靠性;

            (7)硬件可靠性檢驗方法已建立,并已標準化且有一整套完整的理論,而軟件可靠性驗證方法仍未建立,更沒有完整的理論體系;

            (8)硬件可靠性已有成熟的產品市場,而軟件產品市場還很新;

            (9)軟件錯誤是永恒的,可重現的,而一些瞬間的硬件錯誤可能會被誤認為是軟件錯誤。

            從上我們看到,由于軟件固有的特性,軟件可靠性很難以硬件可靠性的概念為基礎,來進行度量和評估,即硬件的可靠性計算方法和相關模型難以用于軟件可靠性的估算中。這也正是軟件可靠性評估與驗證沒有很好的方法、模型和技術,人們無法事先預測軟件可靠性,無法確定軟件可靠性是否增長的根本原因。

            2、軟件可靠性測試

            從軟件可靠性的定義上看,評價或測試一個軟件的可靠性,最主要的是要確定系統怎樣輸入、如何使用一整套的方法和策略。即軟件可靠性測試是指為了達到或驗證用戶對軟件的可靠性要求而對軟件進行的測試,屬于軟件測試或軟件可靠性評價的范疇。盡管軟件可靠性測試也不能保證軟件中殘存的錯誤數達到最少,但經過軟件可靠性測試可以保證軟件的可靠性達到較高的要求。

            軟件可靠性測試是在軟件的預期使用環境中,為了最終評價軟件系統的可靠性而運用建模、統計、試驗、分析、評價等一系列手段對軟件系統實施的一種測試。它應該是面向故障的測試,以用戶將要使用的方式來進行的,每一次測試代表用戶將要完成的一組操作,使測試成為最終產品使用的預演。如:我們可以通過給系統加載一定的業務壓力(例如資源在70%~90%的使用率)的情況下,讓應用持續運行一段時間,測試系統在這種條件下是否能夠穩定運行。這里的可靠性測試僅僅是讓軟件在大壓力環境下運行較長的時間,來估算系統是否能在平均壓力下持續正常工作。

            軟件可靠性測試是獲取軟件可靠性估算數據的重要手段,它通過發現軟件系統可靠性缺陷,為軟件的使用和維護提供數據,確認軟件是否達到可靠性的定量要求。目前軟件可靠性測試用得最多的方法是類似于硬件操作剖面上的統計測試方法,即基于被測軟件操作剖面的統計測試方法。這是最為傳統、經典的軟件可靠性測試方法。通過這種方法,能夠實現軟件可靠性的定量評估,從而有效地保障和提高軟件的質量。

            軟件可靠性測試與傳統意義上的軟件測試不同,軟件可靠性測試是統計測試思想在軟件可靠性度量上的應用,要求測試按照軟件的操作剖面進行,測試結果使用軟件可靠性模型進行評價,其中操作剖面的構造是進行軟件可靠性測試的基礎。

            操作剖面的英文是Operational Profile,也稱為軟件的使用模型,是指系統測試數據輸入域以及各種輸入數據的組合使用概率。它刻畫了在預期環境中軟件各種預期操作的統計分布,用來描述軟件的實際使用情況的。在基于軟件操作剖面的統計測試中,能夠保證在測試過程中較早地發現那些在軟件操作使用中最經常發生的失效。

            操作剖面反映了軟件規格說明定義的預期使用情況。因此在建立操作剖面之前,首先必須對規格說明進行評審和澄清,保證規格說明提供了完整的功能規格說明,描述了軟件在預定環境中的預期使用情況;然后,根據用戶使用這些系統模式、功能、任務的概率對軟件的系統模式、功能、任務需求及相應的輸入激勵的分析來構造操作剖面。操作剖面構造的質量決定著其測試或分析結果是否可信的程度。

            統計測試的英文是statistical testing;是通過使用對輸入統計分布進行分析來構造測試用例的一種測試設計方法。

          統計測試標識出頻繁執行的部分,并相應地調整測試策略,針對這些頻繁執行的部分進行詳盡的測試。通過提高關鍵模塊的安全性和可靠性,來提高整個系統的安全性和可靠性,以提高測試的性價比。統計測試進行的前提條件就是生成如實反映系統使用情況的使用模型。以往使用模型的建立主要是通過預測和估計得出的,不能如實地反映系統的真實情況。

            通過軟件可靠性測試可以有效地發現程序中影響軟件可靠性的缺陷,從而實現可靠性增長。由于軟件可靠性很大程度上依賴條件的變化,特別是軟件操作剖面的輸入分布。因此,我們首先需要建立描述軟件操作情況的操作剖面,然后在軟件的操作剖面基礎上按照概率統計方法設計輸入的分布,最后利用操作剖面從所有軟件操作中獲得統計上正確的采樣并對軟件進行可靠性測試。這種測試方法也是惟一能直接對軟件操作可靠性進行估算的統計方法。通過操作建模可以改進規格說明,得到規格說明的分析性描述,量化測試代價,通過統計測試為軟件可靠性推斷提供依據。

            事實上,軟件可靠性測試方法就是一種黑盒測試方法,它面向需求、面向使用開展測試,不用了解程序的結構、程序的實現等問題。軟件可靠性測試最好由獨立的第三方測試機構來承擔,主要是在系統測試、驗收、交付階段進行。

            總之,基于被測軟件操作剖面的統計測試方法是在對軟件的實際使用情況進行統計的基礎上建立軟件的操作剖面,并采用統計測試的方法進行測試。用這種方法所獲得的測試數據與軟件的實際運行數據比較接近,可直接用于軟件可靠性估算。

            3、基于操作剖面的軟件可靠性壓力測試

            前述的軟件可靠性測試是基于被測軟件操作剖面的統計測試方法,這種方法在操作剖面確定后如何針對由于長期使用軟件性能下降,甚至完全失效這種嚴重影響軟件可靠性的問題上有一定的不足。例如,無休止的線程、無釋放的文件鎖閉、數據污染、存儲空間的徹底分裂與積聚差錯等。而這些問題的產生還是軟件設計和邏輯實現帶來的問題。如果這些問題解決了,就不會出現由于長期使用使軟件性能下降的問題。而解決這一問題的有效方法就是基于操作剖面的壓力測試或疲勞測試,即在一段時間內(經驗上一般是連續72 小時)保持操作剖面上的某些點進行某些操作頻繁使用,檢查系統是否發生功能或者性能上的問題。

            通常現代大型軟件的操作剖面很復雜,覆蓋整個操作剖面進行壓力測試是不現實的。如何在被測軟件的操作剖面上確定壓力測試的范圍或測試點以及壓力測試的類型是軟件可靠性壓力測試的重要研究內容。因此,在傳統的操作剖面上結合軟件可靠性統計測試方法,針對軟件有別于硬件的自身特性,以及軟件由于長期使用使軟件性能下降,甚至完全失效這種嚴重影響軟件可靠性的問題,采用操作剖面壓力測試的方法,確定重要的壓力測試點,并在這些壓力測試點上分別進行相應類型的壓力測試,以保證軟件經過長時間運行后,性能不會下降,失效不會產生,來達到提高軟件可靠性的目的。這種面點結合、互相補充的測試思想豐富了軟件可靠性測試內容,解決了軟件可靠性測試不僅要考慮操作剖面的功能統計測試問題,還要考慮操作剖面上的壓力測試問題,并使操作剖面和操作剖面上的壓力測試點成為相輔相成的軟件可靠性測試方案。

            從以上方案可以看到,準確地尋找操作剖面上的各個壓力測試點,有效地確定壓力測試類型,設計相應的壓力測試用例,并將這些測試用例納入到被測軟件的操作剖面的統計測試用例中是軟件可靠性壓力測試的關鍵,也是現代軟件可靠性測試的關鍵。這需要在操作剖面的基礎上對被測軟件進行靜態分析和動態測試,查找可能嚴重影響軟件可靠性的因素,如:內存泄露、數據污染、線程死鎖、文件沖突等,并將這些作為壓力測試點的壓力測試內容,確定相應的壓力測試類型。

            由于軟件自身的特點,軟件可靠性與硬件可靠性相比內涵發生了根本的變化,軟件可靠性估算必須以軟件可靠性分析及軟件可靠性測試等結果或缺陷數據為重要依據,軟件可靠性估算模型及模型輸入參數與軟件可靠性測試結果緊密相連。為此,我們一定要抓住軟件的特性,強調軟件可靠性測試對于軟件可靠性估算的重要支撐作用,研究軟件可靠性測試方法和技術,特別是研究基于被測軟件操作剖面的壓力測試技術和基于軟件可靠性分析和測試結果的軟件可靠性估算模型是一個有理論價值和變革意義、并存在很大的難度且面臨極大挑戰的研究課題,這也是本文拋磚引玉要達到的目的。

            4、結束語

            本文對軟件的自身特性、軟件可靠性及軟件可靠性測試等概念進行了闡述,并在此基礎上根據筆者工作實踐對軟件可靠性測試方法進行了探討,提出了用操作剖面上的壓力測試概念來彌補傳統的操作剖面上的功能統計測試的不足,強調軟件可靠性測試對于軟件可靠性估算的重要支撐作用。軟件可靠性研究的理論和方法多種多樣但無法實施和運用的關鍵問題是沒有很好地分析和研究軟件的自身特性和軟件出錯的自身規律,照搬照套硬件可靠性的概念和估算方法與估算模型,從而使軟件可靠性估算及評測走向死胡洞。對軟件可靠性估算及評測起決定支撐作用的軟件可靠性測試應該是當前乃至今后的一個重要研究領域或課題。計算機系統或軟件系統的整個可靠性應該分別計算硬件可靠性和軟件可靠性,然后進行結果的科學整合,而這也是國內外研究的空白,因此需要有更多的人力和物力投入到這方面的研究之中。

          posted on 2013-06-25 10:18 順其自然EVO 閱讀(267) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2013年6月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 鄱阳县| 津市市| 华蓥市| 南昌县| 股票| 株洲县| 长春市| 延安市| 新绛县| 黄冈市| 什邡市| 大化| 玉树县| 顺义区| 汾阳市| 正蓝旗| 南靖县| 揭西县| 枞阳县| 宁波市| 五大连池市| 手游| 大埔区| 桐梓县| 寿光市| 奇台县| 峨眉山市| 永嘉县| 广南县| 海宁市| 康马县| 文成县| 梁平县| 正宁县| 尚义县| 福建省| 隆回县| 通海县| 景泰县| 仪征市| 南京市|