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