何 迅
[摘要]本文在介紹軟件可靠性及安全性的基礎上,討論軟件可靠性測試的特點、進行軟件可靠性測試的基本條件,以及軟件安全性測試的必要條件和常用的測試方法。并簡要闡述軟件測試在軟件生產中是必不可少的質量保障手段。
[關鍵詞]軟件可靠性 軟件安全性 基本條件 測試方法
現在的信息系統應用越來越廣泛、越來越深入和重要,成為社會生活不可或缺的東西。而在信息系統中,軟件的比例愈來愈大、愈來愈復雜、地位愈來愈關鍵。軟件的可靠性是整個信息系統可靠性的重要因素,甚至是決定因素。軟件的可靠性是由軟件系統中潛在的漏洞情況決定的。軟件漏洞在復雜的信息系統運行過程中,在一定的輸入信息和運行環境下,潛在的錯誤有時會顯露出來,對系統的運行造成嚴重影響。例如1998年前蘇聯一次載入飛行不能順利返回地面,1996年歐洲阿麗亞娜火箭的發射失敗等,都是由于系統的軟件故障造成的。特別要注意的是軟件往往是系統可靠性的薄弱環節,因此軟件系統的可靠性需要引起有關人員的格外重視。
軟件可靠性是指在規定條件下,在規定時間內,軟件不引起系統失效的概率。該概率是系統輸入和系統使用的函數,也是軟件中存在故障的函數,系統輸入將確定是否會遇到存在的故障。
軟件可靠性測試指在有使用代表性的環境中,為進行軟件可靠性估計對該軟件進行的功能測試。需要說明的是,“使用代表性”指的是在統計意義下該環境能反映出軟件的使用環境特性。軟件可靠性測試一般在軟件驗收階段進行,即可以在實驗室也可以在現場測試運行。一般僅適用于有可靠性定量要求、且可能會影響安全和任務完成的關鍵軟件。
軟件系統的可靠性測試是軟件系統可靠性質量保證過程中非常關鍵的一步,根據國外有關資料統計和工作實踐證明,可靠性測試對提高軟件的可靠性有重大作用,其他測試不能代替,但是軟件可靠性測試又不能代替其他軟件測試的作用。軟件可靠性測試的主要目的有: (1)通過在有使用代表性的環境中執行軟件,以證實軟件需求是否正確實現。(2)為進行軟件可靠性估計采集準確的數據。估計軟件可靠性一般可分為四個步驟,即數據采集、模型選擇、模型擬合以及軟件可靠性評估。可以認為,數據采集是整個軟件可靠性估計工作的基礎,數據的準確與否關系到軟件可靠性評估的準確度。 (3)通過軟件可靠性測試找出所有對軟件可靠性影響較大的錯誤。
軟件可靠性測試分為四個階段:
1.制訂測試方案
本階段的目標是識別軟件功能需求,觸發該功能的輸入和對應的數據域,確定相關的概率分布及需強化測試的功能。
(1)分析功能需求。分析各種功能需求,識別觸發該功能的輸入及相關的數據域(包括合法與不合法的兩部分)。
(2)定義失效等級。判斷是否存在出現危害度較大的1級和2級失效的可能性。如果這種可能性存在,則應進行故障樹分析,標識出所有可能造成嚴重失效的功能需求和其相關的輸入域。
(3)確定概率分布。確定各種不同運行方式的發生概率,判斷是否需要對不同的運行方式進行分別測試。如果需要,則應給出各種運行方式下各數據域的概率分布;否則,給出各數據域的概率分布。判斷是否需要強化測試某些功能。
(4)整理概率分布的信息將這些信息編碼送入數據庫。
2.制訂測試計劃
本階段的目標是:
(1)根據前一階段整理的概率分布信息生成相對應的測試實例集,并計算出每一測試實例預期的軟件輸出結果。本階段需要注意:在按概率分布隨機選擇生成測試實例的同時,要保證測試的覆蓋面。
(2)編寫測試計劃,確定測試順序,分配測試資源。由于本階段前一部分的工作需要考慮大量的信息和數據,因此需要一個軟件支持工具,建立數據庫,并產生測試實例。另外,有時預測軟件輸出結果也需要大量的計算,有些復雜的軟件甚至要用到仿真器模擬輸出結果??傊?具體實施與被測應用軟件的實際功能類型有關。
3.測試
本階段進行軟件測試。需注意的是被測軟件的測試環境(包括硬件配置和軟件支撐環境)應和預期的實際使用環境盡可能一致,對某些環境要求比較嚴格的軟件(如嵌入式軟件)則應完全一致。測試時按測試計劃和順序對每一個測試實例進行測試,判斷軟件輸出是否符合預期結果。測試時應記錄測試結果、運行時間和判斷結果。如果軟件失效,那么還應記錄失效現象和時間,以備以后核對。
4.編寫測試報告
按軟件可靠性估計的要求整理測試記錄,并將結果寫成報告。筆者認為,軟件可靠性測試的關鍵在于:對需求、輸入、數據域的識別及相關概率分布的確定。按照概率分布隨機生成測試實例,并確定測試順序。
軟件可靠性是軟件質量指標體系中最重要的質量指標之一,軟件可靠性指標的高低,決定了軟件是否能穩定、可靠性地工作。軟件中的錯誤是在軟件的開發過程中,因為人的錯誤而引入到軟件中的,而且這種錯誤的出現是不可避免的。經過可靠性測試的軟件系統可以大大降低因軟件系統的實效而造成的損失。但是軟件可靠性測試也不是萬能的,它可以有效降低軟件系統實效的可能,但是不能將軟件系統中存在的錯誤都排除(實際上在可預見的未來也不可能把軟件中的所有錯誤都排除)。
對軟件進行安全測試是軟件測試的重要研究內容。軟件安全測試是保證軟件能夠安全使用的最主要的手段,如何進行高效的安全測試成為業界關注的話題。多年的安全測試經驗告訴我們,做好軟件安全測試的必要條件是:一是充分了解軟件安全漏洞,二是擁有高效的軟件安全測試技術和測試工具。
軟件安全性測試的方法:(1)形式化安全測試。模型檢測用狀態遷移系統S描述軟件的行為,用時序邏輯、計算樹邏輯或演算公式F表示軟件執行必須滿足的性質,通過自動搜索S中不滿足公式F的狀態來發現軟件中的漏洞。(2)基于模型的安全功能測試。基于模型的測試方法是對軟件的行為和結構進行建模,生成測試模型,由測試模型生成測試用例.常用的軟件測試模型有有限狀態機、UML模型、馬爾可夫鏈等。(3)語法測試。語法測試是根據被測軟件的功能接口的語法生成測試輸入,檢測被測軟件對各類輸入的響應。接口可以有多種類型,命令行、文件、環境變量、套接字等。語法測試基于這樣一種思想,軟件的接口或明確或隱含規定了輸入的語法。語法定義了軟件接受的輸入數據的類型、格式。語法定義可采用BNF或正則表達式。語法測試的步驟是識別被測軟件接口的語言,定義語言的語法,根據語法生成測試用例并執行測試。生成的測試輸入應當包含各類語法錯誤,符合語法的正確輸入。不符合語法的畸形輸入等。通過察看被測軟件對各類輸入的處理情況,確定被測軟件是否存在安全缺陷。語法測試適用于被測軟件有較明確的接口語法,易于表達語法并生成測試輸入的情況。語法測試結合故障注入技術可得到更好的測試效果。(4)模糊測試。模糊測試(Fuzz Testing)是一種發現安全漏洞的有效的測試方法,在安全性測試中越來越受到重視。模糊測試將隨機的壞數據插入程序,觀察程序是否能容忍雜亂輸入。模糊測試是不合邏輯的,只是產生雜亂數據攻擊程序。采用模糊測試攻擊應用程序可發現其他采用邏輯思維來測試很難發現的安全缺陷。(5)基于屬性的測試。相關報道描述了基于屬性的測試方法,采用TASPEC語言對軟件的安全屬性進行描述生成安全屬性規格說明,利用程序切片技術抽取與這個安全屬性相關的代碼,測試這部分代碼是否違反安全屬性規格說明。基于屬性的測試有針對性的測試目標軟件的特定安全屬性,可滿足安全屬性的分類和優先級排序要求,且部分與具體軟件無關的屬性規格說明是可重用的。
軟件測試一方面是業務需求檢查、驗證的一種手段,也是檢查軟件功能是否按照系統需求進行設計,是否符合客戶的需要;另一方面也是通過有限的測試數據案例檢查發現程序中存在的Bug是保證軟件質量至關重要的一步。對于像銀行這樣的公司,對系統的要求是每天24小時不間斷工作,特別是國內各商業銀行大集中以后,如果軟件存在Bug引起系統不穩定,一旦出現系統宕機或客戶資金損失,就會造成全國范圍內業務無法辦理,將產生巨大的影響。所以說,對于一個大型應用處理軟件系統,測試貫徹于其中,是一項非常重要的工作,是項目研發中一個相當重要的步驟。而測試質量的好壞直接關系到整個系統能否按期正常投產,關系到系統投產后業務處理是否正確,關系到整個系統運行的可靠性、穩定性。
管理大師彼得?德魯克說:“組織管理的目的就是為了使人們能為實現目標而有效地工作,為此必須設計和維持一種職務結構”。因此,要做好軟件測試工作,在軟件公司內部必須建立一個專門負責軟件產品測試的組織,并配備負責軟件公司全面測試工作的測試管理人員和配備一定數量的具有測試理論、掌握軟件測試技術的專業測試人員??梢愿鶕浖疽幠5拇笮≡O置軟件測試組織的組織架構、隸屬關系和確定軟件測試人員的數量。
近年來,以軟件測試為中心的軟件質量保障技術在軟件生產實踐中得到了迅速發展,軟件測試已經成為軟件生產中必不可少的質量保障手段。
參考文獻:
[1]鄭人杰,殷人昆,陶永雷.實用軟件工程[M].北京:清華大學出版社.
[2]何國偉.軟件可靠性[M].北京:國防工業出版社,1998.
[3]朱鴻,金凌紫.軟件質量保證與測試[M].北京:科學出版社,1997.
[4]Stevens W R著,施振川譯.UNIX網絡編程[M].北京:清華大學出版社,2001.