第一章 緒 論
1.1 軟件生存期
同其它任何事物一樣,計(jì)算機(jī)軟件從它的發(fā)生、發(fā)展到達(dá)成熟階段,以至老化和衰亡,是一個(gè)歷史發(fā)展的過(guò)程,這個(gè)過(guò)程稱(chēng)為軟件的生存期(Life Cycle),包括下列六個(gè)步驟:
(1)計(jì)劃(Planning):確定軟件開(kāi)發(fā)的總目標(biāo);給出軟件的功能、性能、可靠性以及接口等方面的設(shè)想;研究完成該軟件任務(wù)的可行性,探討問(wèn)題解決的方案;對(duì)可供開(kāi)發(fā)使用的資源(軟件、硬件、人力)、成本、可取得的效益和開(kāi)發(fā)的進(jìn)度等做出估計(jì);制定完成開(kāi)發(fā)任務(wù)的實(shí)施計(jì)劃。
(2)需求分析(Requirement Analysis):由軟件人員和用戶共同對(duì)待開(kāi)發(fā)的軟件進(jìn)行詳細(xì)的定義和確切的描述,其結(jié)果是給出軟件需求說(shuō)明書(shū)(SRS:Software Requirement Specification)。
(3)設(shè)計(jì)(Designing):軟件的設(shè)計(jì)分為兩部分。一是概要設(shè)計(jì)(Preliminary Design),是指根據(jù)軟件的需求說(shuō)明書(shū),軟件設(shè)計(jì)人員應(yīng)把需求說(shuō)明書(shū)中各項(xiàng)需求轉(zhuǎn)化為相應(yīng)的體系結(jié)構(gòu),在結(jié)構(gòu)中的每一組成部分是功能明確的模塊,每個(gè)模塊都能體現(xiàn)相應(yīng)的需求。二是詳細(xì)設(shè)計(jì)(Detail Design),是指對(duì)概要設(shè)計(jì)中給出的各個(gè)模塊所要完成的工作進(jìn)行具體的描述,為后來(lái)的編程打下基礎(chǔ)。軟件設(shè)計(jì)的結(jié)果是給出設(shè)計(jì)說(shuō)明書(shū)。
(4)編碼(Coding):利用某種計(jì)算機(jī)語(yǔ)言,把設(shè)計(jì)說(shuō)明書(shū)中規(guī)定的內(nèi)容轉(zhuǎn)化為計(jì)算機(jī)可以接受的程序的過(guò)程稱(chēng)為編碼。編碼應(yīng)以設(shè)計(jì)相一致,且結(jié)構(gòu)清晰、易讀、易修改。
(5)測(cè)試(Testing):根據(jù)軟件的需求說(shuō)明書(shū)、設(shè)計(jì)說(shuō)明書(shū)和源代碼,檢驗(yàn)軟件開(kāi)發(fā)工作的成果是否符合要求的過(guò)程稱(chēng)為軟件測(cè)試。軟件測(cè)試是發(fā)現(xiàn)軟件錯(cuò)誤、提高軟件可靠性與保證軟件質(zhì)量的重要手段。
(6)運(yùn)行與維護(hù)(Running and Maintaining):對(duì)已交付用戶的軟件投入正式使用后便進(jìn)入運(yùn)行階段,這個(gè)階段可能持續(xù)若干年。在運(yùn)行過(guò)程中,可能有多種原因需要對(duì)它進(jìn)行修改,包括運(yùn)行中發(fā)現(xiàn)了軟件錯(cuò)誤需要修正;為適應(yīng)變化了的軟硬件環(huán)境,而需要做相應(yīng)的變更;為進(jìn)一步增強(qiáng)軟件的功能,或提高其性能,而使它進(jìn)一步的完善和擴(kuò)充等。
上述六步表明了一個(gè)軟件從其醞釀開(kāi)始,直至使用相當(dāng)長(zhǎng)的時(shí)間后,被新的軟件代替而退役的整個(gè)過(guò)程。按此順序逐步轉(zhuǎn)變的過(guò)程可用一個(gè)軟件生存期的瀑布模型加以形象化描述。如圖1.1所示。圖中自上而下的箭頭代表了問(wèn)題的一個(gè)求解過(guò)程,而自下而上的箭頭代表了在實(shí)際項(xiàng)目的研制中,為確保軟件質(zhì)量,每一步驟完成后都要進(jìn)行復(fù)查,如發(fā)現(xiàn)了問(wèn)題,就要及時(shí)解決,以免問(wèn)題積壓到最后造成更大的困難。運(yùn)行與維護(hù)的箭頭表示在運(yùn)行中可能需要多次維護(hù)。另外圖中還指明了六個(gè)步驟劃分的三個(gè)階段,軟件定義階段、軟件開(kāi)發(fā)階段和軟件維護(hù)階段。
值得注意的是,上述軟件維護(hù)工作不可簡(jiǎn)單地看待僅僅是修改程序。在運(yùn)行過(guò)程中若有必要修改,得提出充分的修改理由,經(jīng)過(guò)審核,才能確定下來(lái)。接著需要經(jīng)歷制定修改計(jì)劃、確定新的需求、修改軟件設(shè)計(jì)、修改編碼、進(jìn)行測(cè)試以及重新投入運(yùn)行等一系列步驟,這正是上述開(kāi)發(fā)一個(gè)新軟件的步驟。若是運(yùn)行中多次提出修改,則將經(jīng)歷多次這些步驟??捎脠D1.2來(lái)表示這一過(guò)程,并稱(chēng)為軟件的生存周期,也簡(jiǎn)稱(chēng)為軟件的生存期。
1.2
軟件危機(jī)
計(jì)算機(jī)系統(tǒng)工程分為硬件和軟件兩大范疇。計(jì)算機(jī)硬件的工程技術(shù)在過(guò)去的50多年中已經(jīng)達(dá)到了相當(dāng)成熟的狀態(tài)。硬件設(shè)計(jì)技術(shù)和制造技術(shù)發(fā)展非常迅速,其自動(dòng)化已經(jīng)達(dá)到相當(dāng)高的水平,硬件的可靠性已是一種現(xiàn)實(shí)的要求,而不在是一種愿望。
而在軟件工程技術(shù)方面的情況則不同,軟件是最難設(shè)計(jì)、最少可能成功、最容易出錯(cuò)、也最難管理的系統(tǒng)部分。據(jù)報(bào)道,在上世紀(jì)的最后十年里,計(jì)算機(jī)軟件已成為系統(tǒng)癱瘓的主要原因。隨著以計(jì)算機(jī)為基礎(chǔ)的系統(tǒng)在數(shù)量、復(fù)雜程度和應(yīng)用方面的激增,對(duì)軟件的需要卻在不斷增加,因此促使供求矛盾日趨激化,這就是人們常說(shuō)的軟件危機(jī)。軟件危機(jī)的來(lái)源主要表現(xiàn)以下幾個(gè)方面:
(1)缺乏軟件開(kāi)發(fā)的經(jīng)驗(yàn):由于缺乏大型軟件開(kāi)發(fā)的經(jīng)驗(yàn)和軟件開(kāi)發(fā)數(shù)據(jù)的積累,使得開(kāi)發(fā)工作的計(jì)劃很難制定。主觀盲目地制定計(jì)劃,執(zhí)行起來(lái)和實(shí)際情況有很大差距,使得經(jīng)費(fèi)常常突破預(yù)算、工期一拖再拖,軟件的投資者和用戶對(duì)開(kāi)發(fā)工作從不滿意發(fā)展到不信任。
(2)需求不明確:作為軟件設(shè)計(jì)依據(jù)的軟件需求,在開(kāi)發(fā)的初期提得不夠明確,或者未能做出確切的表達(dá)。開(kāi)發(fā)工作開(kāi)始后,軟件人員又未能和用戶及時(shí)的交換意見(jiàn),使得一些問(wèn)題得不到及時(shí)解決而隱藏起來(lái),造成開(kāi)發(fā)后期矛盾的集中暴露。導(dǎo)致對(duì)多個(gè)錯(cuò)綜復(fù)雜的問(wèn)題既難于分析,又難于解決。
(3)缺少開(kāi)發(fā)規(guī)范:開(kāi)發(fā)過(guò)程中沒(méi)有統(tǒng)一遵循的、公認(rèn)的方法論或開(kāi)發(fā)規(guī)范,參加工作的人員之間的配合不夠嚴(yán)密,約定不夠明確。加之不重視文字資料,使得開(kāi)發(fā)文檔很不完整。發(fā)現(xiàn)了問(wèn)題,未能從根本上去找原因,只是修修補(bǔ)補(bǔ)。顯然,這樣開(kāi)發(fā)出來(lái)的軟件無(wú)法維護(hù)。
(4)軟件的復(fù)雜性:軟件的規(guī)模一般都比較龐大,大型軟件有時(shí)會(huì)超過(guò)1億行源代碼。加之人們傳統(tǒng)上的誤區(qū),往往是硬件難以實(shí)現(xiàn)的部分改用軟件來(lái)完成,這使得軟件既龐大,復(fù)雜性又高,甚至有時(shí)人的大腦已無(wú)法理解、無(wú)法駕馭人類(lèi)本身所創(chuàng)造出來(lái)的復(fù)雜邏輯系統(tǒng),投入使用后往往錯(cuò)誤百出。
(5)缺乏有效的測(cè)試手段:軟件的復(fù)雜性和軟件測(cè)試的復(fù)雜性,使得難以研制有效的軟件測(cè)試工具,導(dǎo)致測(cè)試效率不高、自動(dòng)化程度低,測(cè)試花費(fèi)時(shí)間多、測(cè)試成本高,這使得軟件開(kāi)發(fā)者只要求測(cè)試人員對(duì)軟件做簡(jiǎn)單的測(cè)試,這無(wú)法保證軟件的質(zhì)量。
軟件危機(jī)的事例是很多的。最著名的是上世紀(jì)六十年代,美國(guó)IBM公司開(kāi)發(fā)的IBM360操作系統(tǒng),這一項(xiàng)目在開(kāi)發(fā)期共花費(fèi)了5000萬(wàn)美元,總共投入的工作量是5000人年,共寫(xiě)出了100萬(wàn)行源程序。由于它太龐大,OS360變得相當(dāng)不可靠,平均每次修改后的新版本都大約存在1000個(gè)左右的錯(cuò)誤,而且有理由認(rèn)為這是一個(gè)常數(shù)。另外,美國(guó)空軍的范登堡中心在上世紀(jì)六十年代后期發(fā)生過(guò)多次導(dǎo)彈試射失敗的事故,事后檢查幾乎都是由于軟件有錯(cuò)誤而造成的。
與軟件危機(jī)有關(guān)的許多問(wèn)題都起源于軟件本身的特點(diǎn)、軟件開(kāi)發(fā)人員的弱點(diǎn)、以及人們對(duì)軟件開(kāi)發(fā)實(shí)質(zhì)的種種不切實(shí)際的誤解,計(jì)算機(jī)軟件已經(jīng)成為以計(jì)算機(jī)為基礎(chǔ)的系統(tǒng)發(fā)展的重要瓶徑??茖W(xué)上的危機(jī)和其它領(lǐng)域的危機(jī)一樣,解決危機(jī)的過(guò)程往往孕育著一種科學(xué)理論的誕生。自上世紀(jì)七十年代以來(lái),科學(xué)家們一直在試圖解決軟件危機(jī)問(wèn)題,雖然目前尚不能說(shuō)軟件的危機(jī)已經(jīng)過(guò)去,但二十年來(lái),軟件技術(shù)的迅速發(fā)展,包括面向?qū)ο蟮募夹g(shù)、基于知識(shí)的軟件開(kāi)發(fā)環(huán)境、先進(jìn)的軟件測(cè)試工具等,為保證大型軟件的研制提供了重要的基礎(chǔ)。正是這些先進(jìn)的技術(shù),目前上億行源代碼的軟件比比皆是。
1.3 軟件質(zhì)量
質(zhì)量這一概念有許多不同的定義。在《詞?!分?,就把質(zhì)量一詞解析為“產(chǎn)品或工作的優(yōu)劣程度”。國(guó)際標(biāo)準(zhǔn)化組織(ISO)把質(zhì)量定義為“與一個(gè)產(chǎn)品或服務(wù)是否能夠滿足其指定的或蘊(yùn)涵的需求有關(guān)的性質(zhì)與特征的總合”。同其它產(chǎn)品一樣,軟件的質(zhì)量也不是絕對(duì)的,在不同的情況下,對(duì)不同的人來(lái)說(shuō),軟件質(zhì)量的含義是不同的。
1. 軟件質(zhì)量要素
軟件產(chǎn)品的質(zhì)量是由許多軟件性質(zhì)構(gòu)成的,這些性質(zhì)常稱(chēng)為軟件質(zhì)量要素。一般來(lái)講,軟件的質(zhì)量因素有下列11個(gè)。
(1)易使用性:是指軟件易于使用的程度。
(2)完整性:保護(hù)軟件不被未經(jīng)同意的存儲(chǔ)和使用的能力。
(3)效率:指軟件對(duì)計(jì)算機(jī)資源的使用效率,包括運(yùn)算時(shí)間效率和存儲(chǔ)空間效率。
(4)可靠性:不失敗的能力。
(5)正確性:程序完成其規(guī)約的程度。
(6)易維護(hù)性:在程序的操作環(huán)境中,確定軟件故障的位置并糾正故障的難易程度。
(7)靈活性:當(dāng)軟件操作環(huán)境變化時(shí),對(duì)軟件作相應(yīng)修改的難易程度。
(8)易測(cè)試性:對(duì)軟件測(cè)試以保證其無(wú)錯(cuò)誤和滿足其規(guī)約的難易程度。
(9)易移植性:將一個(gè)程序從一個(gè)運(yùn)行環(huán)境移植到另一個(gè)運(yùn)行環(huán)境的難易程度。
(10)易復(fù)用性:復(fù)用一個(gè)軟件或其部分的難易程度。
(11)互用性:將一個(gè)軟件系統(tǒng)和其它軟件系統(tǒng)組合在一起的難易程度。
2.軟件質(zhì)量要素的衡量標(biāo)準(zhǔn)
軟件每個(gè)質(zhì)量要素又包含一系列的衡量標(biāo)準(zhǔn),具體為:
(1)易使用性:包括易操作性、培訓(xùn)、易交流性、輸入和輸出量、輸入輸出速度。
(2)完整性:包括存儲(chǔ)控制、存儲(chǔ)審查。
(3)效率:包括運(yùn)行效率、存儲(chǔ)效率。
(4)可靠性:容錯(cuò)性、一致性、準(zhǔn)確性、簡(jiǎn)潔性。
(5)正確性:包括易追溯性、一致性、完備性。
(6)易維護(hù)性:一致性、簡(jiǎn)潔性、簡(jiǎn)明性、模塊性、自我描述性。
(7)靈活性:模塊性、一般性、易擴(kuò)展性、自我描述性。
(8)易測(cè)試性:簡(jiǎn)潔性、模塊性、檢視、自我描述性。
(9)易移植性:模塊性、自我描述性、硬件獨(dú)立性、軟件獨(dú)立性。
(10)易復(fù)用性:通用性、模塊性、自我描述性、硬件獨(dú)立性、軟件獨(dú)立性。
(11)互用性:模塊性、通訊共同性、數(shù)據(jù)共同性。
每個(gè)衡量標(biāo)準(zhǔn)的定義為:
(1)易追溯性:指在特定的軟件開(kāi)發(fā)與操作環(huán)境中,能夠從軟件的需求尋找出其相應(yīng)的實(shí)現(xiàn)的能力與性質(zhì)。
(2)完備性:指軟件實(shí)現(xiàn)了其全部所需功能的性質(zhì)。
(3)一致性:指在軟件的設(shè)計(jì)與實(shí)現(xiàn)中采用統(tǒng)一的技術(shù)與術(shù)語(yǔ)的性質(zhì)。
(4)準(zhǔn)確性:指軟件的輸出與計(jì)算中的精度滿足其需求的性質(zhì)。
(5)容錯(cuò)性:指在非正常條件下,仍然能夠操作軟件的性質(zhì)。
(6)簡(jiǎn)潔性:指軟件以最容易理解的方式實(shí)現(xiàn)其功能的性質(zhì)。
(7)模塊性:指用一系列在很大程度上相互獨(dú)立的模塊來(lái)構(gòu)成軟件的性質(zhì)。
(8)一般性:指軟件所提供的功能具有應(yīng)用范圍廣的性質(zhì)。
(9)易擴(kuò)展性:指易于對(duì)軟件存儲(chǔ)空間和計(jì)算功能進(jìn)行擴(kuò)充的性質(zhì)。
(10)檢視:指軟件所提供的用于測(cè)量使用情況和識(shí)別錯(cuò)誤的屬性。
(11)自我描述性:指軟件中包含它對(duì)功能的實(shí)現(xiàn)的解析性信息的屬性。
(12)運(yùn)行效率:指軟件使用最少的處理時(shí)間的性質(zhì)。
(13)存儲(chǔ)效率:指軟件在操作中對(duì)存儲(chǔ)空間的需求最少的性質(zhì)。
(14)存儲(chǔ)控制:指反映對(duì)軟件及其數(shù)據(jù)的存儲(chǔ)進(jìn)行控制的能力的性質(zhì)。
(15)存儲(chǔ)審查:指對(duì)軟件及其數(shù)據(jù)的存儲(chǔ)進(jìn)行審查、記錄能力的性質(zhì)。
(16)易操作性:指決定軟件的操作與操作過(guò)程的復(fù)雜程度與難易程度的性質(zhì)。
(17)培訓(xùn):指支持從初步熟悉到熟練操作軟件的過(guò)度的性質(zhì)。
(18)易交流性:指軟件的輸入與輸出能夠被人們理解的程度的性質(zhì)。
(19)軟件獨(dú)立性:指決定對(duì)軟件環(huán)境中的其它軟件的依賴(lài)程度的性質(zhì)。
(20)硬件獨(dú)立性:指決定軟件對(duì)硬件環(huán)境的依賴(lài)程度的性質(zhì)。
(21)通訊共同性:指軟件使用標(biāo)準(zhǔn)的通訊協(xié)議與界面的性質(zhì)。
(22)數(shù)據(jù)共同性:指軟件使用標(biāo)準(zhǔn)的數(shù)據(jù)表示格式的性質(zhì)。
(23)簡(jiǎn)明性:軟件的實(shí)現(xiàn)使用最少代碼的性質(zhì)。
每一個(gè)軟件質(zhì)量衡量標(biāo)準(zhǔn)又可以有多個(gè)不同的度量。軟件質(zhì)量度量有的作用于軟件的代碼,有的作用于軟件開(kāi)發(fā)過(guò)程中產(chǎn)生的中間結(jié)果和文檔。
1.4 軟件可靠性
1.硬件可靠性
所謂系統(tǒng)的可靠性,是指“一個(gè)系統(tǒng)在一定的環(huán)境下,在所給定的時(shí)間內(nèi)能按預(yù)定的要求完成一定功能的概率”。
設(shè)一個(gè)具有N個(gè)元件的系統(tǒng),經(jīng)運(yùn)行t時(shí)間后,有F(t)個(gè)元件失效,其余S(t)個(gè)元件仍然保持完好,則分別定義元件的可靠度R(t)和不可靠度Q(t)為:
定義元件的失效率Z(t)為單位時(shí)間內(nèi)失效的元件數(shù)與非失效的元件數(shù)之比。
根據(jù)理論研究和大量統(tǒng)計(jì)得出,在正常的工作條件下,元件的失效變化趨勢(shì)如圖1.3所示。這就是硬件系統(tǒng)可靠性分析中著名的盆式曲線(Bathtub curve)。它表明系統(tǒng)在使用的開(kāi)始階段,其失效率是比較高的,但隨著故障的排除,其失效率將穩(wěn)定在一個(gè)基本上保持不變的常數(shù),這個(gè)時(shí)期稱(chēng)為正常的使用期。由于受到周?chē)h(huán)境、元件老化等因數(shù)的影響,在使用一定的時(shí)間后,系統(tǒng)的故障率開(kāi)始上升,而且越來(lái)越高,直至系統(tǒng)被淘汰。
在正常的使用期,系統(tǒng)的失效率可以近似為一個(gè)常數(shù)l,則:
解這個(gè)方程,并考慮到R(0)=1,有:
硬件可靠性理論中的一個(gè)重要參數(shù)是系統(tǒng)的平均故障間隔時(shí)間MTBF(Mean Time Between Failures)和平均故障時(shí)間MTTF(Mean Time To Failures)。MTBF是指可修復(fù)故障的系統(tǒng),而MTTF是指不可修復(fù)故障的系統(tǒng)。如果忽略這一點(diǎn),MTBF和MTTF是混用的。因此,根據(jù)定義:
上述公式是硬件可靠性的基本理論,也是一套非常成熟的理論。
經(jīng)過(guò)幾十年的發(fā)展,硬件可靠性不但在理論上成熟的,而且在工程上也有許多提高可靠性的方法和工具。目前,一般出廠的硬件產(chǎn)品都有可靠性指標(biāo),如風(fēng)險(xiǎn)函數(shù)和MTBF等。
2.軟件可靠性
軟件的可靠性定義為:在給定的時(shí)間內(nèi),特定環(huán)境下軟件正確運(yùn)行的概率。正如前節(jié)所述,軟件可靠性是軟件質(zhì)量的要素之一。對(duì)用戶而言,同其它軟件質(zhì)量要素相比,軟件可靠性是最重要的要素。
從其定義可以看出,軟件可靠性涉及三個(gè)概念:給定的時(shí)間、特定的環(huán)境、正確運(yùn)行的概率。
對(duì)給定的時(shí)間,是指由于軟件的可靠性是隨時(shí)間而變化的,根據(jù)軟件可靠性的理論,軟件每排除一個(gè)故障,其可靠性就提高一步。因此,在談?wù)撥浖煽啃缘臅r(shí)候,一定要指明是什么時(shí)間的可靠性。
特定的環(huán)境是軟件可靠性的一個(gè)重要的因素,它包括硬件環(huán)境、軟件支撐環(huán)境和其它為保證軟件正常運(yùn)行所需要的環(huán)境。在評(píng)估軟件可靠性時(shí),一般要假設(shè)環(huán)境是正確無(wú)誤的。
正確運(yùn)行的概率情況比較復(fù)雜,軟件運(yùn)行包括選擇輸入數(shù)據(jù)和啟動(dòng)程序執(zhí)行。但問(wèn)題是如何選擇輸入數(shù)據(jù)才能真實(shí)的反應(yīng)軟件的可靠性?如何根據(jù)錯(cuò)誤發(fā)生的時(shí)間來(lái)評(píng)估軟件可靠性?軟件可靠性的變化規(guī)律是什么?等等,類(lèi)似的問(wèn)題在軟件可靠性理論的研究中都沒(méi)有很好的解決。雖然如此,在過(guò)去的三十余年里,科學(xué)家在這個(gè)方面做了大量的研究,目前比較著名的有四十余種軟件可靠性模型,由于工程數(shù)據(jù)的來(lái)源以及對(duì)軟件可靠性認(rèn)識(shí)上的不同,這些模型存在較大的差異。一個(gè)新的軟件究竟用那種可靠性模型去評(píng)估更好,目前尚無(wú)定論。只能根據(jù)工程背景和個(gè)人的喜好去判斷。
拋開(kāi)尋求統(tǒng)一的軟件可靠性模型,近幾年來(lái),許多科學(xué)家試圖從工程的角度研究軟件可靠性的部分內(nèi)容,主要是軟件的平均無(wú)故障時(shí)間MTBF、軟件的故障率l等,這些參數(shù)對(duì)用戶來(lái)說(shuō)恐怕是更重要的。目前的許多軍用軟件、關(guān)系到國(guó)計(jì)民生的一些重要軟件都有相應(yīng)的可靠性參數(shù)評(píng)估,也是軟件生產(chǎn)應(yīng)達(dá)到的目標(biāo)。
根據(jù)軟件可靠性的理論,一個(gè)軟件在交付之后,軟件的可靠性就是確定的,只不過(guò)人們現(xiàn)在還沒(méi)有很好的辦法去認(rèn)識(shí)它。拋開(kāi)其它因素不談,唯一能影響軟件可靠性的是殘留在軟件中錯(cuò)誤數(shù)目。隨著軟件在測(cè)試過(guò)程中或在使用過(guò)程中,軟件錯(cuò)誤的不斷發(fā)現(xiàn)與排除,殘留在軟件中的錯(cuò)誤會(huì)逐步減少,軟件的故障率會(huì)逐步降低,因此,軟件的故障率曲線應(yīng)該類(lèi)似于圖1.4所示的曲線。這是軟件可靠性建模的基本思想。
1.5 軟件錯(cuò)誤
1. 軟件錯(cuò)誤的概念
定義1.1:錯(cuò)誤(Error):是指人們期望的和系統(tǒng)實(shí)際具有的狀態(tài)或行為之間的偏差。
軟件錯(cuò)誤包括由系統(tǒng)分析或者程序設(shè)計(jì)而產(chǎn)生的全部錯(cuò)誤。軟件錯(cuò)誤存在于軟件生存期的各個(gè)階段,凡是和預(yù)期的狀態(tài)或行為不相符合的統(tǒng)稱(chēng)為軟件錯(cuò)誤。例如,制定的計(jì)劃和實(shí)際不相符合的、需求說(shuō)明書(shū)有問(wèn)題的、設(shè)計(jì)說(shuō)明書(shū)有問(wèn)題的、程序編碼有問(wèn)題的、測(cè)試有問(wèn)題的、運(yùn)行結(jié)果不正確的、維護(hù)有問(wèn)題的等等,都是軟件錯(cuò)誤。
定義1.2:失效(Failure):是指在軟件運(yùn)行期間出現(xiàn)的錯(cuò)誤。它是因軟件中存在的錯(cuò)誤引起的、并在執(zhí)行期間動(dòng)態(tài)表現(xiàn)出來(lái)的和實(shí)際不同的狀態(tài)和行為。
從這里可以看出,失敗只是錯(cuò)誤的一部分。
定義1.3:故障(Fault):是指軟件中的物理缺陷。
故障也是錯(cuò)誤的一部分,故障是指軟件中實(shí)實(shí)在在存在的錯(cuò)誤。故障可能引起軟件的失效,也可能不引起軟件的失效,人們總是通過(guò)修改軟件中的故障來(lái)提高軟件的可靠性。
定義1.4:缺陷(Defect,Bug):凡是沒(méi)有按照要求所進(jìn)行的工作統(tǒng)稱(chēng)為缺陷。
缺陷泛指系統(tǒng)中的一切錯(cuò)誤。顯然,缺陷是比錯(cuò)誤范圍更大的概念,缺陷除了包括錯(cuò)誤所具有的全部屬性外,像程序的多余物、難以理解的程序、難以修改的程序,文檔不完全等,雖然這些可能并不能使軟件失敗,但是缺陷。通過(guò)修改軟件中的缺陷來(lái)提高軟件的質(zhì)量。
從定義可以看出,上述四個(gè)概念是彼此相關(guān)的,有些文獻(xiàn)中也經(jīng)常是混用的。實(shí)際使用時(shí)應(yīng)區(qū)分它們之間的層次和范圍。
2.軟件的缺陷數(shù)目與缺陷密度
軟件的缺陷數(shù)目是指軟件中所存在的所有缺陷的總和。而軟件的缺陷密度是指每單位代碼中的缺陷數(shù)目,這里,單位代碼一般是KLOC或KSLOC(千行源代碼),表示為缺陷數(shù)目/KLOC,或者缺陷數(shù)目/KSLOC。
軟件工程師在工作中一般會(huì)引入大量的缺陷。統(tǒng)計(jì)表明,有經(jīng)驗(yàn)的軟件工程師的缺陷引入率一般是50~250個(gè)缺陷/KLOC,平均的缺陷引入率在100個(gè)缺陷/KLOC以上。即使軟件工程師學(xué)過(guò)軟件缺陷管理之后,平均的缺陷引入率也在50個(gè)缺陷/KLOC,也就是說(shuō),每20行代碼中就有一個(gè)缺陷。再者從理論上看,人的認(rèn)識(shí)能力是有限的,根據(jù)Hatton模型,對(duì)一般的軟件,軟件的缺陷數(shù)目可用下面的公式表示:
這里W是軟件的復(fù)雜度,一般用源代碼數(shù)目來(lái)表示。
從工程實(shí)踐來(lái)看,目前世界上先進(jìn)的軟件開(kāi)發(fā)組織所生產(chǎn)的軟件,其缺陷密度可以達(dá)到2個(gè)缺陷/KLOC,一般的軟件開(kāi)發(fā)組織所生產(chǎn)的軟件其缺陷密度可以達(dá)到4~40個(gè)缺陷/KLOC。據(jù)統(tǒng)計(jì),在美國(guó),安全第一的軟件開(kāi)發(fā)的代價(jià)是每行程序需花費(fèi)500$。NASA所生產(chǎn)的軟件其故障密度可以達(dá)到0.1個(gè)缺陷/KLOC,但其代價(jià)是每行源代碼高達(dá)1000$。
軟件的缺陷數(shù)目或者缺陷密度可以通過(guò)測(cè)試或者其它方法來(lái)計(jì)算。而殘留在軟件中缺陷數(shù)目或者缺陷密度只能通過(guò)評(píng)估來(lái)得到,例如根據(jù)測(cè)試的程度、或者根據(jù)軟件可靠性模型等可以預(yù)測(cè)軟件中殘留的缺陷數(shù)目。
在安全第一或者一些重要的軟件驗(yàn)收中,軟件的缺陷數(shù)目或者缺陷密度是軟件能否通過(guò)驗(yàn)收的重要標(biāo)準(zhǔn)。
3.軟件錯(cuò)誤的分類(lèi)方法
軟件的錯(cuò)誤是非常復(fù)雜的,凡是人們能夠想到的軟件錯(cuò)誤都是可能發(fā)生的。到目前為止,人們對(duì)軟件錯(cuò)誤的認(rèn)識(shí)尚停留在表面上,其內(nèi)在規(guī)律有待進(jìn)一步研究。這也是目前軟件測(cè)試技術(shù)發(fā)展比較緩慢的原因之一。雖然如此,人們還是可以根據(jù)軟件錯(cuò)誤的表現(xiàn)將其進(jìn)行分類(lèi),常見(jiàn)的分類(lèi)方法有:
(1)根據(jù)錯(cuò)誤的征兆進(jìn)行分類(lèi):這種分類(lèi)方法是根據(jù)系統(tǒng)的輸入和系統(tǒng)對(duì)輸入的反應(yīng)結(jié)果進(jìn)行的分類(lèi)。如表1.1所示。這種分類(lèi)方法的好處是可以提高人們認(rèn)識(shí)錯(cuò)誤的嚴(yán)重程度,以便防范于未然。
表1.1 根據(jù)錯(cuò)誤的征兆進(jìn)行的分類(lèi)
輸入
系統(tǒng)反應(yīng)
錯(cuò)誤輸入
正確輸入
對(duì)輸入的拒絕
正確
第I類(lèi)型的錯(cuò)誤(嚴(yán)重)
得出錯(cuò)誤的結(jié)果
第II類(lèi)型的錯(cuò)誤(嚴(yán)重)
第III類(lèi)型的錯(cuò)誤(嚴(yán)重)
系統(tǒng)崩潰
第IV類(lèi)型的錯(cuò)誤(嚴(yán)重)
第V類(lèi)型的錯(cuò)誤(嚴(yán)重)
(2)根據(jù)錯(cuò)誤的起因進(jìn)行的分類(lèi):計(jì)算機(jī)系統(tǒng)中的每一個(gè)錯(cuò)誤,究其原因,大都可以歸結(jié)為下列三種情況之一,硬件或軟件中的設(shè)計(jì)錯(cuò)誤、由于環(huán)境或部件的老化引起的硬件惡化、錯(cuò)誤的輸入數(shù)據(jù)。顯然,在軟件生存期的不同階段,每類(lèi)錯(cuò)誤的分布是不一樣的,因此,這種分類(lèi)方法的好處,一是了解錯(cuò)誤在不同時(shí)期的分布規(guī)律。例如,在系統(tǒng)運(yùn)行的早期所發(fā)生的錯(cuò)誤,很有可能是設(shè)計(jì)錯(cuò)誤或數(shù)據(jù)錯(cuò)誤所引起的,在運(yùn)行相當(dāng)長(zhǎng)的時(shí)間后所發(fā)生的錯(cuò)誤可能是由于數(shù)據(jù)錯(cuò)誤引起的,而在運(yùn)行相當(dāng)長(zhǎng)的時(shí)間后,就有可能是硬件惡化引起的,這為判斷軟件錯(cuò)誤的類(lèi)型并盡快修復(fù)提供依據(jù)。二是根據(jù)這種分類(lèi),可以知道那些錯(cuò)誤是可以排除的,而那些錯(cuò)誤又必須通過(guò)是更換設(shè)備才能解決的。
(3)根據(jù)錯(cuò)誤發(fā)生的持續(xù)時(shí)間來(lái)分類(lèi):一般可將其分為永久性錯(cuò)誤和瞬時(shí)錯(cuò)誤。永久性錯(cuò)誤是指經(jīng)常發(fā)生的錯(cuò)誤,這類(lèi)錯(cuò)誤是不可怕的,因?yàn)樗菀妆慌懦?。而瞬時(shí)錯(cuò)誤恰恰相反,由于是偶爾出現(xiàn),難以掌握其規(guī)律,故很難將其排除。
(4)根據(jù)錯(cuò)誤的嚴(yán)重程度進(jìn)行分類(lèi):不同的錯(cuò)誤所產(chǎn)生的后果是不一樣的。較少的錯(cuò)誤例如數(shù)據(jù)格式不對(duì),并不會(huì)產(chǎn)生什么后果,而有些錯(cuò)誤,例如飛機(jī)導(dǎo)航軟件出錯(cuò),可能導(dǎo)致機(jī)毀人忘的嚴(yán)重后果。一般來(lái)講,根據(jù)錯(cuò)誤的嚴(yán)重程度可以分為:較少錯(cuò)誤、中等錯(cuò)誤、較嚴(yán)重錯(cuò)誤、嚴(yán)重錯(cuò)誤、非常嚴(yán)重錯(cuò)誤和最嚴(yán)重錯(cuò)誤。這里的分類(lèi),是根據(jù)錯(cuò)誤引起后果的程度來(lái)分的,而不是根據(jù)錯(cuò)誤對(duì)應(yīng)故障的復(fù)雜性來(lái)分類(lèi)的,有時(shí)一個(gè)較少的故障,例如,程序語(yǔ)句漏掉一個(gè)標(biāo)點(diǎn)符號(hào)等,都可能產(chǎn)生嚴(yán)重的后果。
(5)根據(jù)開(kāi)發(fā)階段進(jìn)行分類(lèi):在軟件生存期的每個(gè)階段都可能存在錯(cuò)誤,即計(jì)劃錯(cuò)誤、需求分析錯(cuò)誤、設(shè)計(jì)錯(cuò)誤、編碼錯(cuò)誤、測(cè)試錯(cuò)誤、運(yùn)行與維護(hù)錯(cuò)誤。由于生存期的每一個(gè)階段又是下一個(gè)階段的先導(dǎo),也就是說(shuō),前一個(gè)階段正確的設(shè)計(jì)是保證下一個(gè)階段設(shè)計(jì)正確的必要條件。因此,要求一旦發(fā)現(xiàn)某個(gè)階段存在錯(cuò)誤,就要盡快將其排除。否則,越往后,排除故障的代價(jià)就越大,從這種意義上講,這種分類(lèi)法是必要的。
4.軟件錯(cuò)誤的分類(lèi)
雖然上述給出了軟件錯(cuò)誤的五類(lèi)分類(lèi)方法,但前四種的分類(lèi)方法只能給人們一個(gè)感性的認(rèn)識(shí),對(duì)排除故障并沒(méi)有很大的幫助。
(1)根據(jù)軟件開(kāi)發(fā)階段的分類(lèi):根據(jù)軟件開(kāi)發(fā)階段的分類(lèi)方法針對(duì)性比較強(qiáng),便于人們認(rèn)識(shí)錯(cuò)誤和糾正錯(cuò)誤。表1.2給出了一種基于開(kāi)發(fā)階段的分類(lèi)方法,表中給出的錯(cuò)誤數(shù)據(jù)比例是根據(jù)含有6877000個(gè)語(yǔ)句的源程序的錯(cuò)誤(共16029個(gè)錯(cuò)誤)進(jìn)行統(tǒng)計(jì)的結(jié)果。
表1.2:基于開(kāi)發(fā)階段的分類(lèi)方法
錯(cuò)誤類(lèi)型
描述
錯(cuò)誤個(gè)數(shù)
百分比
軟件需求錯(cuò)誤
包括軟件需求制定得不合理或不正確;需求不完全;含有邏輯錯(cuò)誤;需求分析的文檔有誤。
1317
8.2%
功能和性能錯(cuò)誤
包括功能和性能規(guī)定得有錯(cuò)誤,或是遺漏了某些功能;為用戶提供的信息有錯(cuò)誤,或信息不確切;對(duì)意外的異常情況處理有誤等。
2624
16.1%
結(jié)構(gòu)錯(cuò)誤
包括程序控制流或控制順序有誤;處理過(guò)程有誤等。
4082
25.2%
數(shù)據(jù)錯(cuò)誤
包括數(shù)據(jù)定義或數(shù)據(jù)結(jié)構(gòu)有誤;數(shù)據(jù)存儲(chǔ)或數(shù)據(jù)操作有誤等。
3638
22.4%
實(shí)現(xiàn)和編碼錯(cuò)誤
包括編碼錯(cuò)或按鍵錯(cuò);違背編碼風(fēng)格或是編碼標(biāo)準(zhǔn)錯(cuò)誤;文檔有誤等。
1601
9.9%
集成錯(cuò)誤
包括軟件內(nèi)部和外部接口有誤;各相關(guān)部分在時(shí)間配合、數(shù)據(jù)吞吐量等方面不協(xié)調(diào)等。
1455
9.0%
系統(tǒng)結(jié)構(gòu)錯(cuò)誤
操作系統(tǒng)調(diào)用錯(cuò)或使用錯(cuò)、恢復(fù)錯(cuò)誤、診斷錯(cuò)誤、分割及覆蓋錯(cuò)誤、引用環(huán)境錯(cuò)誤等。
282
1.7%
測(cè)試定義與測(cè)試執(zhí)行錯(cuò)誤
包括測(cè)試設(shè)計(jì)錯(cuò)誤、測(cè)試執(zhí)行錯(cuò)誤、測(cè)試文檔錯(cuò)誤、測(cè)試用例不充分等。
447
2.8%
其它類(lèi)型錯(cuò)誤
763
4.7%
(2)基于引起錯(cuò)誤復(fù)雜度的分類(lèi):如表1.3所示。
表1.3:基于引起錯(cuò)誤復(fù)雜度的分類(lèi)
錯(cuò)誤類(lèi)型
描述
文檔
注釋、消息。
語(yǔ)法
拼寫(xiě)、標(biāo)點(diǎn)符號(hào)、打字、指令格式。
聯(lián)編打包
變更管理、庫(kù)、版本控制。
賦值
說(shuō)明、重名、作用域、限制。
接口
過(guò)程調(diào)用與引用、輸入/輸出、用戶格式。
檢查
出錯(cuò)信息、不合適的檢查。
數(shù)據(jù)
結(jié)構(gòu)、內(nèi)容。
函數(shù)
邏輯、指針、循環(huán)、遞歸、計(jì)算、函數(shù)缺陷。
系統(tǒng)
配置、記時(shí)、內(nèi)存。
環(huán)境
設(shè)計(jì)、編譯、測(cè)試、其它系統(tǒng)支持問(wèn)題。
5.軟件錯(cuò)誤的危害
(1)軟件錯(cuò)誤可能造成的危害:近年來(lái),隨著計(jì)算機(jī)應(yīng)用領(lǐng)域的迅速擴(kuò)大,計(jì)算機(jī)軟、硬件新技術(shù)的不斷涌現(xiàn),人們對(duì)軟件的質(zhì)量提出了新的更高的要求。目前,計(jì)算機(jī)已廣泛地應(yīng)用于航天、航空、工業(yè)控制、交通、銀行、金融、醫(yī)療等領(lǐng)域。在這樣的應(yīng)用領(lǐng)域中,軟件質(zhì)量往往關(guān)系到人民生命財(cái)產(chǎn)和生態(tài)環(huán)境的安危。一旦軟件發(fā)生故障,就可能造成人的生命和財(cái)產(chǎn)的巨大損失和生態(tài)環(huán)境的破壞。例如:
· 國(guó)際上,計(jì)算機(jī)已普遍用于核電站的控制與安全保護(hù),一旦軟件發(fā)生故障,將會(huì)造成人員傷亡和環(huán)境污染。
· 在倫敦希思羅國(guó)際機(jī)場(chǎng),平均每三分鐘就有一架飛機(jī)起落,如果調(diào)度飛機(jī)場(chǎng)著陸次序的軟件發(fā)生故障,將會(huì)造成飛機(jī)相撞的災(zāi)難。
· 波音747等大型客機(jī)都使用計(jì)算機(jī)自動(dòng)導(dǎo)航系統(tǒng),如果它發(fā)生故障,將會(huì)造成機(jī)毀人忘的事故。
· 在西方國(guó)家,鐵路信號(hào)系統(tǒng)已計(jì)算機(jī)化。英國(guó)已計(jì)劃在不久的將來(lái)實(shí)現(xiàn)鐵路信號(hào)和扳道的全部自動(dòng)化。鐵路交通的安全性將進(jìn)一步依賴(lài)計(jì)算機(jī)系統(tǒng)的正常運(yùn)行。
· 在巴黎地鐵系統(tǒng)中,由于使用計(jì)算機(jī)進(jìn)行有效的調(diào)度和安全控制,火車(chē)的行駛速度得以加快,火車(chē)之間的間隔得以縮短。
· 現(xiàn)代通信技術(shù)和網(wǎng)絡(luò)技術(shù)的發(fā)展,使得人們相互之間的信息交換達(dá)到完全自動(dòng)化,如果主控計(jì)算機(jī)出現(xiàn)故障,則它所控制的用戶對(duì)外的信息交流將被中斷,所造成的損失是難以估量的。
· 一旦銀行系統(tǒng)的計(jì)算機(jī)出現(xiàn)故障,將會(huì)造成混亂。這也是目前銀行系統(tǒng)尚需人工備份資料的重要原因。
以上類(lèi)似的例子很多,難以枚舉。隨著計(jì)算機(jī)科學(xué)、信息科學(xué)和其它自然科學(xué)的發(fā)展,我們有理由相信,人們將會(huì)越來(lái)越依靠計(jì)算機(jī),計(jì)算機(jī)將是人類(lèi)生活的重要組成部分,到那時(shí),計(jì)算機(jī)的錯(cuò)誤將不在僅僅是一個(gè)技術(shù)問(wèn)題,而將完全變成一個(gè)普遍的社會(huì)問(wèn)題。
(2)軟件錯(cuò)誤已經(jīng)造成的危害:軟件的錯(cuò)誤給人類(lèi)生活已經(jīng)造成的危害的事例是很多的,這里僅舉幾個(gè)例子。
· 歐洲航空航天局發(fā)射的啊里亞那火箭,由于軟件的錯(cuò)誤而使發(fā)射失敗,所攜帶的衛(wèi)星報(bào)廢,損失巨大。
· 中國(guó)的´´衛(wèi)星,也是由于軟件的錯(cuò)誤,在運(yùn)行不到一年后就失去作用。根據(jù)事后的分析表明,僅僅是由于一個(gè)非常簡(jiǎn)單的軟件錯(cuò)誤而使耗資巨大的衛(wèi)星報(bào)廢,多么可失!
· 由于控制放射性治療設(shè)備的軟件錯(cuò)誤,在加拿大已經(jīng)造成了多起癌癥病人因受到過(guò)量放射性輻射而死亡的事故。
· 在英國(guó),由于放射性治療設(shè)備中計(jì)算輻射量的軟件錯(cuò)誤,發(fā)生了癌癥病人因放射性輻射太低而得不到適當(dāng)治療的事故。
· 在倫敦,救護(hù)車(chē)調(diào)度軟件剛剛投入使用幾小時(shí)就發(fā)生故障,造成急診病人延誤達(dá)十幾小時(shí)。
· 飛機(jī)自動(dòng)控制軟件的錯(cuò)誤造成了飛機(jī)在特技飛行表演時(shí)墜毀。
· 自動(dòng)行李處理系統(tǒng)的小小軟件錯(cuò)誤使丹佛國(guó)際機(jī)場(chǎng)飛機(jī)受阻,到達(dá)的行李空等九個(gè)月。
類(lèi)似的例子也很多。當(dāng)我們每天依靠計(jì)算機(jī)進(jìn)行工作時(shí),一旦計(jì)算機(jī)發(fā)生錯(cuò)誤,給我們?cè)斐傻奈:κ强嗖豢把?,可能我們幾個(gè)月甚至幾年的勞動(dòng)會(huì)付諸東流。表1.4給出了部分計(jì)算機(jī)系統(tǒng)實(shí)效源的統(tǒng)計(jì)數(shù)據(jù)。
表1.4計(jì)算機(jī)系統(tǒng)實(shí)效源的統(tǒng)計(jì)數(shù)據(jù)
系統(tǒng)
數(shù)據(jù)發(fā)表年份
硬件(%)
軟件(%)
維護(hù)(%)
操作(%)
環(huán)境(%)
AT&T ESS
1978
20
15
—
65
—
Tandem
1985
18
26
25
17
14
Bellcore
1986
26
30
—
44
—
Tandem
1987
19
43
13
13
12
可見(jiàn),軟件故障正逐漸成為導(dǎo)致計(jì)算機(jī)系統(tǒng)失效的主要因素。
1.6 軟件測(cè)試概論
1. 軟件測(cè)試的概念
由于軟件及軟件錯(cuò)誤的復(fù)雜性,長(zhǎng)期以來(lái),人們對(duì)軟件測(cè)試的認(rèn)識(shí)一直是模糊的。許多科學(xué)家從不同的角度給出了軟件測(cè)試的不同定義,但總體來(lái)看,都是不全面的。Myers認(rèn)為:“程序測(cè)試是為了發(fā)現(xiàn)錯(cuò)誤而執(zhí)行程序的過(guò)程”,該定義明確給出了軟件測(cè)試就是為了發(fā)現(xiàn)軟件中的錯(cuò)誤,這一概念目前被人們所公認(rèn)。但該定義認(rèn)為軟件測(cè)試僅僅是程序編碼的測(cè)試,這顯然是不全面的,在某種意義上說(shuō)是有害的,因?yàn)樵S多軟件錯(cuò)誤并不是編碼上的錯(cuò)誤,而人們往往會(huì)忽略這一點(diǎn)。
1983年IEEE給出的定義是:“使用人工或自動(dòng)手段來(lái)運(yùn)行或測(cè)定某個(gè)系統(tǒng)的過(guò)程,其目的在于檢驗(yàn)它是否滿足規(guī)定的需求或是弄清楚預(yù)期結(jié)果與實(shí)際結(jié)果之間的差別”。應(yīng)該說(shuō)該定義是比較全面的。應(yīng)該說(shuō),上述兩個(gè)定義都是以檢驗(yàn)軟件是否存在錯(cuò)誤為目的,也可以說(shuō)是一種正確性測(cè)試。但也有人不同意這種觀點(diǎn),認(rèn)為軟件測(cè)試還應(yīng)包括可靠性測(cè)試、健壯性測(cè)試、性能測(cè)試、效率測(cè)試等。作者認(rèn)為,軟件的測(cè)試是和軟件的需求是密切相關(guān)的,對(duì)一般的民用軟件,正確性測(cè)試是能夠滿足要求的。而對(duì)某些關(guān)鍵性軟件,如導(dǎo)航控制軟件、核電站控制軟件等則必須進(jìn)行后幾種測(cè)試。但要指出的是,進(jìn)行后幾種測(cè)試,僅僅編寫(xiě)一個(gè)軟件測(cè)試程序是不夠的,往往研制必須的硬件環(huán)境,其代價(jià)往往是很大的。因此,本文我們所論述的測(cè)試一般都是指面向軟件正確性的測(cè)試。
2. 如何認(rèn)識(shí)軟件錯(cuò)誤
目前,影響軟件測(cè)試技術(shù)發(fā)展的一個(gè)重要因素就是人們對(duì)軟件測(cè)試在認(rèn)識(shí)上存在的誤區(qū)。誤區(qū)之一是設(shè)計(jì)者、程序員對(duì)自己所做的工作特別有信心,不愿意讓別人來(lái)挑自己的毛病。誤區(qū)之二是既然軟件測(cè)試不能證明軟件是正確的,何必又需要測(cè)試呢?誤區(qū)之三是由于軟件測(cè)試是一種輔助性的工作,既費(fèi)力又難以出成績(jī)。很多人不愿意做這個(gè)工作。因此,解決人們認(rèn)識(shí)上的問(wèn)題是非常有必要的。
(1)軟件能否徹底的測(cè)試:回答是不能。例如,一元二次方程ax2+bx+c=0求根的程序,該程序的3個(gè)輸入a、b、c是實(shí)數(shù),假設(shè)計(jì)算機(jī)有32位(假設(shè)8位階碼),每個(gè)數(shù)據(jù)的數(shù)據(jù)個(gè)數(shù)至少為1030,則總的數(shù)據(jù)個(gè)數(shù)要大于1090。要徹底測(cè)試一個(gè)軟件,就要每個(gè)數(shù)據(jù)都至少運(yùn)行一次,這是目前所有計(jì)算機(jī)都不可能做到的。上述還僅僅考慮了輸入的一部分,在使用中,用戶有意或無(wú)意的可能輸入其它數(shù)據(jù),例如字符等??紤]到這些因素,要徹底測(cè)試一個(gè)軟件是不可能的。
軟件不能被徹底的測(cè)試并不否定軟件測(cè)試的作用。正如一個(gè)再好的醫(yī)生也不可能檢查出病人的所有毛病一樣,據(jù)此就否定醫(yī)生的作用是錯(cuò)誤的。早在1972年,Dijkstra曾說(shuō)過(guò)一句名言:“軟件測(cè)試只能表明錯(cuò)誤的存在,而不能表明錯(cuò)誤不存在”。
(2)早期的錯(cuò)誤是否應(yīng)在早期排除:回答是肯定的。軟件的錯(cuò)誤存在于軟件生存期的各個(gè)階段,在每一階段發(fā)現(xiàn)的錯(cuò)誤都應(yīng)在此階段將其排除掉,否則,越往后,排除講越困難。有人作過(guò)統(tǒng)計(jì),在后一個(gè)階段排除前一個(gè)階段的錯(cuò)誤,其費(fèi)用將提高10倍。經(jīng)過(guò)近些年來(lái)軟件工程技術(shù)的實(shí)踐,人們對(duì)這個(gè)問(wèn)題已不在有什么懷疑。但存在的問(wèn)題是:不是人們發(fā)現(xiàn)了早期的錯(cuò)誤不排除,而是沒(méi)人去發(fā)現(xiàn)早期的錯(cuò)誤,這種情形很普遍,是軟件設(shè)計(jì)的災(zāi)難,必須引起足夠的重視。
(3)能否用驗(yàn)證技術(shù)代替軟件測(cè)試:回答是不能。程序驗(yàn)證是采用形式化的方法來(lái)檢驗(yàn)軟件是否正確,從理論上看,該方法對(duì)檢驗(yàn)軟件的錯(cuò)誤是完備的。但實(shí)際上,程序驗(yàn)證技術(shù)有很大的局限性,實(shí)踐表明,該方法只能對(duì)一些小的例子是有效的,大中型軟件正確性驗(yàn)證無(wú)論從方法上還是從驗(yàn)證效率上,都是不實(shí)際的。此外,經(jīng)過(guò)程序驗(yàn)證的軟件,需求分析錯(cuò)誤、接口錯(cuò)誤等也檢驗(yàn)不出來(lái)。
3. 軟件測(cè)試的費(fèi)用
統(tǒng)計(jì)表明,軟件測(cè)試與維護(hù)的費(fèi)用要占到整個(gè)軟件開(kāi)發(fā)費(fèi)用的50%以上。圖1.5給出了估計(jì)修復(fù)軟件缺陷費(fèi)用的現(xiàn)行行業(yè)標(biāo)準(zhǔn)(資料來(lái)源:B.Bohem,Software Engineeering,IEEE Transactions on Computer,1976.12)。表明缺陷發(fā)現(xiàn)的越晚,費(fèi)用將如何驚人的增長(zhǎng)。
4.
軟件測(cè)試的意義
(1)減少軟件的缺陷數(shù)目或者降低軟件的缺陷密度:通過(guò)測(cè)試可以發(fā)現(xiàn)軟件中存在的缺陷,通過(guò)完全的修改這些缺陷,可以減少軟件中缺陷的總數(shù)目或者降低其缺陷密度。
(2)提高軟件的可靠性:軟件的缺陷數(shù)目是影響軟件可靠性的主要因素,通過(guò)測(cè)試減少軟件的缺陷數(shù)目可以達(dá)到提高軟件可靠性的目的。
(3)評(píng)估軟件的性能指標(biāo):通過(guò)軟件測(cè)試,根據(jù)所發(fā)現(xiàn)的缺陷數(shù)目和發(fā)現(xiàn)缺陷的時(shí)間,可以評(píng)估軟件的可靠性等指標(biāo)。即使軟件測(cè)試沒(méi)有發(fā)現(xiàn)缺陷,也同樣可以達(dá)到這個(gè)目的。
(4)增加用戶對(duì)軟件的信心。軟件通過(guò)了何種測(cè)試對(duì)用戶來(lái)說(shuō)是非常重要的,嚴(yán)格的軟件測(cè)試可以大大用戶對(duì)該軟件的信心。
1.7 軟件測(cè)試方法
軟件的錯(cuò)誤存在于軟件生存期的各個(gè)階段,不同階段的錯(cuò)誤性質(zhì)是不同的,不同的錯(cuò)誤對(duì)應(yīng)了不同的測(cè)試方法。本章所論述的靜態(tài)測(cè)試方法、動(dòng)態(tài)測(cè)試方法、黑盒測(cè)試方法和白盒測(cè)試方法就是根據(jù)上述問(wèn)題而發(fā)展起來(lái)的。有些方法是通用的,例如靜態(tài)測(cè)試技術(shù),在軟件生存期各個(gè)階段的錯(cuò)誤檢測(cè)中都可以使用,而有些方法只是對(duì)某個(gè)階段才能使用,例如,動(dòng)態(tài)測(cè)試技術(shù),只有當(dāng)程序出來(lái)以后才能進(jìn)行動(dòng)態(tài)測(cè)試。不同的測(cè)試方法對(duì)各個(gè)階段錯(cuò)誤檢測(cè)的效率也是不同的,有些時(shí)候,在同一階段,當(dāng)各種方法組合使用時(shí),錯(cuò)誤檢測(cè)的效果會(huì)更好。此外,對(duì)程序測(cè)試而言,分步測(cè)試更有利于盡快的發(fā)現(xiàn)錯(cuò)誤,減少測(cè)試的開(kāi)銷(xiāo)。
1.靜態(tài)測(cè)試方法
(1)測(cè)試方法:在軟件開(kāi)發(fā)過(guò)程中,每產(chǎn)生一個(gè)文檔,都必須對(duì)它進(jìn)行測(cè)試,以確定它的質(zhì)量是否滿足要求。靜態(tài)測(cè)試的基本特征是在對(duì)軟件進(jìn)行分析、檢查和測(cè)試時(shí)不實(shí)際運(yùn)行被測(cè)試的程序。它可以對(duì)各種文檔進(jìn)行測(cè)試,是軟件開(kāi)發(fā)中十分有效的質(zhì)量控制方法之一。在軟件開(kāi)發(fā)過(guò)程中的早期階段,由于可運(yùn)行的代碼尚未產(chǎn)生,不可能進(jìn)行動(dòng)態(tài)測(cè)試,而這些階段的中間產(chǎn)品的質(zhì)量直接關(guān)系到軟件開(kāi)發(fā)的成敗與開(kāi)銷(xiāo)的大小,因此,在這些階段,靜態(tài)測(cè)試的作用尤為重要。目前,比較常用的靜態(tài)測(cè)試方法有:Yourdon的結(jié)構(gòu)化走通法和Fagan檢查法。
1) 結(jié)構(gòu)化走通法。結(jié)構(gòu)化走通是由一組人員對(duì)一個(gè)文檔從多種不同的角度進(jìn)行檢查,以盡可能多地發(fā)現(xiàn)其中的錯(cuò)誤。它以該文檔的產(chǎn)生者為中心,由產(chǎn)生者向參加審閱的其他人員報(bào)告其文檔。所發(fā)現(xiàn)的錯(cuò)誤或懷疑是錯(cuò)誤的問(wèn)題則由召集人記錄在案。審閱的中心問(wèn)題是發(fā)現(xiàn)錯(cuò)誤,而不是糾正錯(cuò)誤。在結(jié)構(gòu)化走通的審閱過(guò)后,由文檔的產(chǎn)生者將記錄在案的錯(cuò)誤糾正。
Yourdon指出,結(jié)構(gòu)化走通的審閱過(guò)程應(yīng)該由如下人員組成:
· 報(bào)告者:該文檔的擁有者和文檔的產(chǎn)生者;
· 召集人:組織并主持審閱;
· 秘書(shū):負(fù)責(zé)事先將文檔散發(fā)給有關(guān)人員,記錄審閱過(guò)程和結(jié)果,并將記錄遞交給報(bào)告者;
· 維護(hù)者:將負(fù)責(zé)維護(hù)該文檔的人員的代表;
· 標(biāo)準(zhǔn)檢查員:負(fù)責(zé)對(duì)照該文檔所適用的標(biāo)準(zhǔn)進(jìn)行檢查的人員;
· 用戶代表:負(fù)責(zé)從其使用者的觀點(diǎn)檢查該文檔;
· 其他人員:任何對(duì)該文檔的檢查能夠有所貢獻(xiàn)的人員。
2)Fagan檢查。Fagan檢查是由IBM發(fā)展起來(lái)的,其總的原理和Yourdon的結(jié)構(gòu)化走通非常類(lèi)似。但是Fagan檢查是將審閱放在一個(gè)質(zhì)量計(jì)劃、度量和控制的更廣泛的環(huán)境下,使之具有雙重目的:一是發(fā)現(xiàn)產(chǎn)品的錯(cuò)誤;二是通過(guò)對(duì)錯(cuò)誤的分析、統(tǒng)計(jì),提供今后對(duì)所發(fā)現(xiàn)的同類(lèi)錯(cuò)誤進(jìn)行控制的數(shù)據(jù)。Fagan檢查強(qiáng)調(diào)的是對(duì)錯(cuò)誤進(jìn)行分類(lèi)和統(tǒng)計(jì),從而發(fā)現(xiàn)共同的錯(cuò)誤類(lèi)型和將來(lái)避免這類(lèi)錯(cuò)誤的方法。簡(jiǎn)言之,F(xiàn)agan檢查強(qiáng)調(diào)對(duì)開(kāi)發(fā)過(guò)程的反饋和從錯(cuò)誤中吸取教訓(xùn)。
(2)測(cè)試內(nèi)容。靜態(tài)測(cè)試測(cè)試的范圍和內(nèi)容很多。從范圍上講,凡是能形成文檔的設(shè)計(jì)都應(yīng)該進(jìn)行測(cè)試。這包括需求定義文檔的靜態(tài)測(cè)試、概要設(shè)計(jì)文檔的靜態(tài)測(cè)試、詳細(xì)設(shè)計(jì)文檔的靜態(tài)測(cè)試、編碼文檔的靜態(tài)測(cè)試、測(cè)試文檔的靜態(tài)測(cè)試等。從內(nèi)容上看,針對(duì)不同的文檔,雖測(cè)試的內(nèi)容不盡相同,但都是按照軟件質(zhì)量的要求,即第一章給出的軟件質(zhì)量的11個(gè)要素進(jìn)行測(cè)試。下面以源代碼的靜態(tài)測(cè)試為例說(shuō)明靜態(tài)測(cè)試所包括的內(nèi)容。
1)完備性測(cè)試。檢查代碼是否完全、準(zhǔn)確地實(shí)現(xiàn)了設(shè)計(jì)規(guī)約中所規(guī)定的內(nèi)容;代碼是否滿足設(shè)計(jì)要求;代碼是否創(chuàng)建了所需的數(shù)據(jù)庫(kù)或其它初始化數(shù)據(jù);是否有未引用的或未定義的變量、常量或數(shù)據(jù)類(lèi)型。
2)一致性測(cè)試。檢查代碼在邏輯上與設(shè)計(jì)規(guī)約是否一致;是否自始自終使用了相同的格式、調(diào)用約定、結(jié)構(gòu)等。
3)正確性測(cè)試。代碼是否符合標(biāo)準(zhǔn);變量的定義和使用是否都正確;注釋是否正確;子程序調(diào)用的參數(shù)個(gè)數(shù)是否正確等。
4)易修改性測(cè)試。檢查代碼是否避免了直接使用地址,而采用標(biāo)號(hào)或符號(hào)常量;代碼是否由單入口、單出口的子程序構(gòu)成;是否有交叉引用數(shù)據(jù)等。
5)可測(cè)試性測(cè)試。檢查程序中是否有遞歸;是否包含了無(wú)窮循環(huán)等。
6)健壯性測(cè)試。檢查代碼是否防止可以發(fā)現(xiàn)的運(yùn)行時(shí)刻的錯(cuò)誤,如:下標(biāo)變量越界、除數(shù)為0、棧溢出等。
7)結(jié)構(gòu)化測(cè)試。檢查程序的每一個(gè)功能是否都可以作為一塊代碼而識(shí)別出;循環(huán)是否只有一個(gè)入口等。
8)易追溯性測(cè)試。檢查是否有一個(gè)交叉引用表,通過(guò)它可以便捷地從代碼找到相應(yīng)的設(shè)計(jì);是否有修改歷史記錄,它記錄對(duì)代碼的所有修改歷史和修改原因。
9)易理解性測(cè)試。檢查注釋是否簡(jiǎn)潔、充分;是否有不必要的復(fù)雜代碼等。
10)可驗(yàn)證性測(cè)試。檢查實(shí)現(xiàn)是否避免了使用測(cè)試難度大的技術(shù)和方法等。
(3)方法評(píng)述:靜態(tài)測(cè)試主要靠人來(lái)完成的。雖然近些年來(lái),從需求分析開(kāi)始的軟件生存期的各個(gè)階段,開(kāi)發(fā)了不少的工具,但短期內(nèi)難以實(shí)現(xiàn)其設(shè)計(jì)的自動(dòng)化和測(cè)試的自動(dòng)化。因此,靜態(tài)測(cè)試錯(cuò)誤發(fā)現(xiàn)的多少完全依賴(lài)于測(cè)試的組織和測(cè)試者的水平,實(shí)踐也表明在這個(gè)方面有許多成功的范例,例如中國(guó)的某個(gè)有數(shù)萬(wàn)行航天類(lèi)控制軟件,通過(guò)靜態(tài)測(cè)試發(fā)現(xiàn)了其中的3000多個(gè)缺陷。但從目前靜態(tài)測(cè)試的效果來(lái)看尚存在如下的一些問(wèn)題。
1)認(rèn)識(shí)不足。特別是決策者的認(rèn)識(shí)不足。但這種情況正在改變。
2)測(cè)試的問(wèn)題太多,不知從何處下手。解決這個(gè)問(wèn)題的辦法是可以對(duì)靜態(tài)測(cè)試的范圍和內(nèi)容進(jìn)行分門(mén)別類(lèi)的測(cè)試,效果可能會(huì)更好。
3)自動(dòng)化或半自動(dòng)化的測(cè)試工具是必須的。有了這個(gè)工具,可以大大提高測(cè)試者的興趣和發(fā)現(xiàn)錯(cuò)誤的能力。但目前基本上是空白。
4)開(kāi)發(fā)的軟件缺少靜態(tài)測(cè)試所必須的文檔。這個(gè)在一些地方還十分突出,但這種情況正在好轉(zhuǎn)。
2. 動(dòng)態(tài)測(cè)試方法
靜態(tài)測(cè)試只能定性的分析軟件的質(zhì)量,而不能定量。從這種意義上講,靜態(tài)測(cè)試是有很大的局限性,但這并不否定靜態(tài)測(cè)試的重要性,因?yàn)?,就發(fā)現(xiàn)一個(gè)錯(cuò)誤而言,動(dòng)態(tài)測(cè)試的花費(fèi)要大得多。
所謂動(dòng)態(tài)測(cè)試,就是通過(guò)運(yùn)行軟件來(lái)檢驗(yàn)軟件的動(dòng)態(tài)行為和運(yùn)行結(jié)果的正確性。因此,動(dòng)態(tài)測(cè)試只存在于軟件生存期的編碼階段之后。動(dòng)態(tài)測(cè)試包括兩個(gè)基本要素:一是被測(cè)程序,二是用于運(yùn)行軟件的數(shù)據(jù),稱(chēng)為測(cè)試數(shù)據(jù),程序一次運(yùn)行所需要的測(cè)試數(shù)據(jù)稱(chēng)為測(cè)試用例,所以測(cè)試數(shù)據(jù)是測(cè)試用例的集合。
動(dòng)態(tài)測(cè)試的流程如圖1.6所示。因此,一個(gè)成熟的動(dòng)態(tài)測(cè)試軟件必須回答下列問(wèn)題:
1) 如何選擇或產(chǎn)生測(cè)試用例?
2) 如何組織軟件的測(cè)試運(yùn)行?
3) 如何考察和記錄軟件動(dòng)態(tài)運(yùn)行的行為?
4) 如何判斷軟件動(dòng)態(tài)行為的正確性?
5) 測(cè)試過(guò)程如何結(jié)束?
6) 如何通過(guò)軟件測(cè)試的結(jié)果分析軟件的某些性質(zhì),如軟件的可靠性等?
動(dòng)態(tài)測(cè)試近三十年來(lái),由于有其比較強(qiáng)的錯(cuò)誤檢測(cè)能力,受到人們的普遍重視,產(chǎn)生了許多測(cè)試方法。這些方法可以從兩個(gè)角度對(duì)其進(jìn)行分類(lèi)。
(1)按照產(chǎn)生測(cè)試數(shù)據(jù)以及判斷測(cè)試充分性的方法:可以分為如下四類(lèi):
1)結(jié)構(gòu)性測(cè)試。結(jié)構(gòu)性測(cè)試旨在充分地覆蓋軟件的結(jié)構(gòu),并以軟件中的某些元素是否都已得到測(cè)試為準(zhǔn)則來(lái)判斷軟件測(cè)試的充分性。本書(shū)將在第四章做詳細(xì)介紹。
2)排錯(cuò)性測(cè)試。排錯(cuò)性測(cè)試旨在排除軟件中包含某類(lèi)錯(cuò)誤的可能性,并根據(jù)一個(gè)測(cè)試數(shù)據(jù)集排除軟件錯(cuò)誤可能性的能力來(lái)度量其測(cè)試的充分性。
3)分域測(cè)試。分域測(cè)試方法通過(guò)對(duì)軟件的實(shí)現(xiàn)或/和軟件需求進(jìn)行分析,將軟件的輸入空間劃分成一系列子空間,然后在每一個(gè)子空間內(nèi)選擇一個(gè)或多個(gè)測(cè)試用例。
4)功能測(cè)試。功能測(cè)試是根據(jù)軟件所需的功能或/和所實(shí)現(xiàn)的功能選擇測(cè)試數(shù)據(jù),分析測(cè)試的充分性。
(2)按照產(chǎn)生測(cè)試數(shù)據(jù)所根據(jù)的信息來(lái)源:可以分為下列四類(lèi):
1)以程序?yàn)榛A(chǔ)的測(cè)試。它通過(guò)對(duì)程序的分析來(lái)產(chǎn)生測(cè)試數(shù)據(jù),它還以程序被執(zhí)行的程度來(lái)判斷測(cè)試是否充分。
2)以需求和功能的規(guī)約為基礎(chǔ)的測(cè)試。它通過(guò)分析軟件的需求和功能規(guī)約來(lái)產(chǎn)生測(cè)試數(shù)據(jù),并根據(jù)軟件需求和功能規(guī)約中所規(guī)定的功能和性能是否都得到了充分的檢驗(yàn)來(lái)判斷測(cè)試是否充分。
3)程序和需求相結(jié)合的測(cè)試。它綜合考慮軟件的需求和實(shí)現(xiàn)來(lái)產(chǎn)生測(cè)試數(shù)據(jù),判斷測(cè)試的充分性,這是目前最常用的方法,可以擬補(bǔ)(1)和(2)單個(gè)方法的不足。
4)以界面為基礎(chǔ)的測(cè)試。以界面為基礎(chǔ)的測(cè)試僅僅依靠軟件與其運(yùn)行環(huán)境之間的界面來(lái)產(chǎn)生測(cè)試數(shù)據(jù),并以界面和界面內(nèi)所包含的功能是否都得到測(cè)試來(lái)判斷測(cè)試的充分性。這是面向?qū)ο蠹夹g(shù)常用的測(cè)試方法。
3.黑盒測(cè)試方法
黑盒測(cè)試又稱(chēng)功能測(cè)試、數(shù)據(jù)驅(qū)動(dòng)測(cè)試和基于規(guī)格說(shuō)明的測(cè)試。用這種方法進(jìn)行程序測(cè)試時(shí),被測(cè)程序被當(dāng)作一個(gè)打不開(kāi)的黑盒,測(cè)試者是在完全不知道程序內(nèi)部結(jié)構(gòu)的情況下進(jìn)行的,而只需知道程序的輸入和輸出之間的關(guān)系亦可。因此,黑盒測(cè)試是基于用戶的測(cè)試。測(cè)試者正是依靠這個(gè)關(guān)系來(lái)產(chǎn)生測(cè)試用例,并判斷運(yùn)行結(jié)果的正確性。進(jìn)行黑盒測(cè)試必須要弄清楚下列幾個(gè)問(wèn)題:
(1)軟件的功能到底有多少?這是進(jìn)行黑盒測(cè)試所必須的,否則,測(cè)試是不可能充分的。
(2)測(cè)試的層次是什么?也就是說(shuō),測(cè)試要在哪個(gè)層次上進(jìn)行。因?yàn)?,在軟件的總體功能之下可能有若干個(gè)層次的功能,在需求分析層描述的功能一般比較粗,在這個(gè)層次上進(jìn)行測(cè)試可能會(huì)漏掉一些細(xì)節(jié)。而在代碼層則一般比較細(xì),但在這個(gè)層次上進(jìn)行測(cè)試可能會(huì)忽視各個(gè)功能之間存在的相互作用和相互依賴(lài)的關(guān)系。因此測(cè)試人員需要考慮并兼顧各個(gè)層次的功能。也正是由于這個(gè)原因,使得黑盒測(cè)試的影響大大降低。
黑盒測(cè)試是必要的,有時(shí)也是必須的。所謂是必須的,是作為測(cè)試者而言,并不總能得到程序的源代碼,而往往只有程序的說(shuō)明書(shū)和執(zhí)行代碼,在此情況下,唯一的測(cè)試方法就必須采用黑盒測(cè)試技術(shù)。所謂必要的,是相對(duì)白盒測(cè)試而言的,主要表現(xiàn)如下幾個(gè)方面:
(1)白盒測(cè)試并不是最后的測(cè)試手段,因?yàn)榘缀袦y(cè)試驗(yàn)證不了諸如軟件可靠性等參數(shù),而這恰恰是黑盒測(cè)試所要做的工作。
(2)黑盒測(cè)試不能對(duì)程序的特定部位進(jìn)行測(cè)試,因而無(wú)法對(duì)程序進(jìn)行排錯(cuò)。而這恰恰是白盒測(cè)試可以做到的。
對(duì)一般的測(cè)試軟件系統(tǒng),采用黑盒測(cè)試和白盒測(cè)試相結(jié)合的測(cè)試方法,往往會(huì)取得更好的測(cè)試效果。
4.白盒測(cè)試方法
白盒測(cè)試又稱(chēng)結(jié)構(gòu)測(cè)試、邏輯驅(qū)動(dòng)測(cè)試或基于程序的測(cè)試。用這種方法進(jìn)行程序測(cè)試時(shí),測(cè)試者可以看到被測(cè)程序,并利用其分析程序的內(nèi)部構(gòu)造。因此,白盒測(cè)試是基于程序的測(cè)試。白盒測(cè)試是根據(jù)被測(cè)程序的內(nèi)部結(jié)構(gòu)設(shè)計(jì)測(cè)試用例的一類(lèi)測(cè)試。它要求對(duì)被測(cè)程序的結(jié)構(gòu)特性做到一定程度的覆蓋,因此,白盒測(cè)試也稱(chēng)為基于覆蓋的測(cè)試技術(shù)。到目前為止,已經(jīng)提出了幾十種覆蓋技術(shù),我們將在第四章做詳細(xì)論述。但必須說(shuō)明無(wú)論那種白盒測(cè)試的覆蓋技術(shù),即使達(dá)到100%的覆蓋率,也不能保障把所有的錯(cuò)誤都檢測(cè)出來(lái)。對(duì)于某些在規(guī)格說(shuō)明書(shū)中規(guī)定的,但在實(shí)現(xiàn)中被漏掉的功能,無(wú)論那一種測(cè)試也檢測(cè)不出來(lái)的。因此,提高結(jié)構(gòu)測(cè)試的覆蓋率只能增強(qiáng)人們對(duì)被測(cè)軟件的信心。
動(dòng)態(tài)測(cè)試和靜態(tài)測(cè)試是一種分類(lèi)方法,黑盒測(cè)試與白盒測(cè)試又是另外的一種分類(lèi)方法。二者是有許多交叉的。動(dòng)態(tài)測(cè)試含有黑盒測(cè)試與白盒測(cè)試,靜態(tài)測(cè)試一般只含有白盒測(cè)試。黑盒測(cè)試一般都是動(dòng)態(tài)測(cè)試,而白盒測(cè)試一般都包含動(dòng)態(tài)測(cè)試和靜態(tài)測(cè)試。
5.其它測(cè)試方法
(1)可靠性測(cè)試與排錯(cuò)性測(cè)試:可靠性測(cè)試是以驗(yàn)證或評(píng)估軟件的可靠性為目的,并不關(guān)心測(cè)試過(guò)程中所發(fā)現(xiàn)的錯(cuò)誤。正如前邊所述,軟件錯(cuò)誤是不可能完全避免的,軟件存在的錯(cuò)誤并不影響軟件的交付,用戶所關(guān)心的是軟件的可靠性究竟是多少。排錯(cuò)性測(cè)試則恰恰相反,該測(cè)試是以排除軟件錯(cuò)誤為目的的,一旦測(cè)試發(fā)現(xiàn)錯(cuò)誤,就立刻予以排除。一般而言,排錯(cuò)性測(cè)試用于軟件測(cè)試的早期階段,并以白盒測(cè)試為主要測(cè)試手段。而可靠性測(cè)試用于軟件測(cè)試的末尾階段,一般以黑盒測(cè)試為主要測(cè)試手段。
(3)人工測(cè)試與自動(dòng)測(cè)試:顧名思義,人工測(cè)試是采用人工的手段對(duì)軟件實(shí)施的測(cè)試,它是相對(duì)自動(dòng)測(cè)試而言的。和靜態(tài)測(cè)試不同,人工測(cè)試貫穿于軟件生存期的各個(gè)階段,并通過(guò)人工運(yùn)行和審查會(huì)的形式對(duì)軟件實(shí)施的測(cè)試。人工測(cè)試中,主要是測(cè)試人員根據(jù)一些成熟的軟件設(shè)計(jì)規(guī)則對(duì)軟件的正確性等進(jìn)行審查,檢驗(yàn)所進(jìn)行的設(shè)計(jì)是否能滿足需要。實(shí)踐表明,人工測(cè)試是非常有效但往往被忽略。統(tǒng)計(jì)表明,人工測(cè)試能發(fā)現(xiàn)30%~70%的錯(cuò)誤,IBM公司的代碼審查會(huì)的查錯(cuò)率更高,竟能查出全部錯(cuò)誤的80%。軟件測(cè)試還有其它更多的測(cè)試方法,在后面的幾章中將有詳細(xì)的敘述。
1.8 軟件測(cè)試步驟
圖1.7給出了軟件的生存期和軟件測(cè)試之間的關(guān)系。也可以用圖1.8來(lái)描述,即軟件測(cè)試的V模型。軟件測(cè)試是要分步進(jìn)行的,為什么呢?打一個(gè)比方,對(duì)一個(gè)1000行的程序搜索一個(gè)錯(cuò)誤和10個(gè)100行的程序搜索一個(gè)錯(cuò)誤其代價(jià)是不一樣的。從軟件測(cè)試的角度來(lái)看,分步測(cè)試的原因有三個(gè):一是和上述例子類(lèi)似,即把大問(wèn)題劃成小問(wèn)題,這更有利于問(wèn)題的求解。二是軟件則不同的層次上,其錯(cuò)誤的類(lèi)型是不一樣的,其測(cè)試的側(cè)重點(diǎn)和測(cè)試方法是不同的。其三是在級(jí)別高的層次上檢測(cè)低級(jí)層次上的錯(cuò)誤其花費(fèi)要大幅度的增長(zhǎng),圖有人做過(guò)統(tǒng)計(jì),在下面的給出的四個(gè)測(cè)試層次上,即單元測(cè)試、集成測(cè)試、確認(rèn)測(cè)試和系統(tǒng)測(cè)試,層次每增加一
級(jí),測(cè)試一個(gè)錯(cuò)誤的代價(jià)就要提高10倍以上,圖1.5也充分的說(shuō)明了這一點(diǎn)??梢杂脠D1.9來(lái)表示各個(gè)測(cè)試步驟之間的關(guān)系。
(1)單元測(cè)試:?jiǎn)卧獪y(cè)試是對(duì)軟件中的基本組成單位進(jìn)行測(cè)試,如一個(gè)模塊、一個(gè)過(guò)程、一個(gè)函數(shù)或一個(gè)類(lèi),等等。單元測(cè)試是軟件測(cè)試最基本的組成部分,也是最重要的部分之一。其目的是檢驗(yàn)軟件基本組成單位的正確性。一個(gè)軟件單元的正確性是相對(duì)該單元的規(guī)約而言的,因此,單元測(cè)試是以被測(cè)單位的規(guī)約為基準(zhǔn)。單元測(cè)試要注意如下的問(wèn)題:
1)單元的大小要適宜。一般是以程序中給出的模塊為準(zhǔn),但有時(shí)一個(gè)模塊可能太大,有時(shí)也可能太少,這二者都會(huì)對(duì)單元測(cè)試的效果產(chǎn)生不利的影響。一般來(lái)講,一個(gè)單元模塊在幾十行到幾百行源代碼為宜。
2)單元測(cè)試一般要給出驅(qū)動(dòng)模塊和樁模塊。一般來(lái)講,一個(gè)單元是不能獨(dú)立運(yùn)行的,因此,要設(shè)計(jì)一些模塊,使之能驅(qū)動(dòng)被測(cè)模塊的執(zhí)行,這種模塊稱(chēng)之為驅(qū)動(dòng)模塊。另外,一個(gè)被測(cè)模塊還可能調(diào)用其它的模塊,而在測(cè)試一個(gè)單元時(shí),一般是不考慮其它模塊的測(cè)試的,因此設(shè)計(jì)一類(lèi)模塊稱(chēng)之為樁模塊,用于模擬運(yùn)行被測(cè)模塊時(shí)調(diào)用的其它模塊。
(2)集成測(cè)試:集成測(cè)試是在軟件系統(tǒng)集成過(guò)程中所進(jìn)行的測(cè)試,其主要目的是檢查軟件單位之間接口的正確性。它根據(jù)集成測(cè)試計(jì)劃,一邊將模塊或其它軟件單位組合成越來(lái)越大的系統(tǒng),一邊運(yùn)行該系統(tǒng),以分析所組成的系統(tǒng)是否正確,各組成部分是否合拍。集成測(cè)試的策略主要有自頂向下和自底向上兩種。
1)自頂向下的集成測(cè)試策略從軟件的主控模塊入手,將其直接調(diào)用的模塊首先與其集成。并將該子系統(tǒng)所調(diào)用的過(guò)程和所使用的數(shù)據(jù)用一些簡(jiǎn)單的代碼——即樁模塊代替,在樁模塊的幫助下,可以運(yùn)行并測(cè)試這一子系統(tǒng),直至測(cè)試結(jié)果滿足要求為止。然后,將這一子系統(tǒng)所調(diào)用的模塊與該子系統(tǒng)集成,并重復(fù)上述過(guò)程,直到測(cè)試完畢。
2)自底向上的集成測(cè)試策略則相反,從軟件中不調(diào)用任何其它單元的模塊入手,把直接調(diào)用該模塊的程序與其集成在一起,在驅(qū)動(dòng)模塊的幫助下,完成該子系統(tǒng)的測(cè)試。然后,再把調(diào)用該子系統(tǒng)的模塊和該子系統(tǒng)集成,并重復(fù)上述過(guò)程,直到測(cè)試完畢。
這兩種方法各有優(yōu)缺點(diǎn),在實(shí)踐中,可將兩種方法相結(jié)合。
(3)系統(tǒng)測(cè)試:系統(tǒng)測(cè)試是對(duì)已經(jīng)集成好的軟件系統(tǒng)進(jìn)行徹底的測(cè)試,以檢驗(yàn)軟件系統(tǒng)的正確性和性能(如運(yùn)算的精度、系統(tǒng)的反應(yīng)時(shí)間)等是否滿足其規(guī)約所指定的要求。系統(tǒng)測(cè)試在許多情況下是比較復(fù)雜的,僅僅編制一個(gè)測(cè)試程序是不夠的,往往伴隨著要建立一個(gè)軟硬結(jié)合的測(cè)試系統(tǒng)。
(4)驗(yàn)收測(cè)試:驗(yàn)收測(cè)試旨在向軟件的購(gòu)買(mǎi)者展示該軟件系統(tǒng)滿足其用戶的要求。它的測(cè)試數(shù)據(jù)通常是系統(tǒng)測(cè)試數(shù)據(jù)的子集。所不同的是,驗(yàn)收測(cè)試常常需要用戶的代表在場(chǎng),甚至在軟件安裝的現(xiàn)場(chǎng)。這是投入使用前的最后測(cè)試。
(5)回歸測(cè)試:回歸測(cè)試是在軟件維護(hù)階段,對(duì)軟件修改之后進(jìn)行的測(cè)試。其目的是檢驗(yàn)對(duì)軟件進(jìn)行的修改是否正確。這里,修改的正確性有兩重含義:一是指所作的修改達(dá)到了預(yù)期的目的,如錯(cuò)誤得到改正,能夠適應(yīng)新的運(yùn)行環(huán)境。二是指不影響軟件的其它功能的正確性。
回歸測(cè)試通常包括重新運(yùn)行系統(tǒng)測(cè)試中的部分測(cè)試數(shù)據(jù)。因此,需要搞清楚哪些測(cè)試數(shù)據(jù)是與被修改的代碼有關(guān)。在軟件開(kāi)發(fā)過(guò)程中,保留測(cè)試數(shù)據(jù)與程序代碼之間的關(guān)系對(duì)回歸測(cè)試具有很大的幫助?;貧w測(cè)試還往往需要使用針對(duì)所修改的代碼的測(cè)試數(shù)據(jù)。這樣的測(cè)試數(shù)據(jù)可以根據(jù)單元測(cè)試、集成測(cè)試和系統(tǒng)測(cè)試的方法產(chǎn)生。
1.9 軟件測(cè)試與軟件可靠性
從理論上看,軟件的可靠性只和存在于軟件中的故障有關(guān)。假設(shè)軟件S中有n個(gè)故障f1,f2,…,fn,直觀上,軟件S的可靠性R可以表示為RS= RS(f1,f2,…,fn)。假設(shè)D是S的定義域,f(D)是D中每個(gè)點(diǎn)取值的概率,{D,f(D)}是S的運(yùn)行剖面,在{D,f(D)}下,假設(shè)每個(gè)故障被檢測(cè)的概率為qi=P(fi),這里,所謂的檢測(cè)概率是指一次性檢測(cè)該故障的概率,或者說(shuō),一次運(yùn)行產(chǎn)生錯(cuò)誤的概率。若S中存在n個(gè)故障,則:
定理1:若n個(gè)故障f1,f2,…,fn是相互獨(dú)立的,則:
實(shí)際上l即是在存在n個(gè)故障的前提下,軟件S的風(fēng)險(xiǎn)函數(shù)。
根據(jù)軟件可靠性理論,軟件S初始的故障數(shù)目可以假設(shè)為一個(gè)常數(shù)n。隨著測(cè)試的進(jìn)行,存在于軟件S的故障不斷的被排除(假設(shè)是完全排除,即不引入新的故障),存在于軟件中的故障會(huì)越來(lái)越少。由于每排除一個(gè)故障后,剩余的存在于S中故障集合是排除前存在于S中故障集合的子集,因此不難證明:
定理2:設(shè)F1和F2是軟件S兩個(gè)故障集合,若F1ÍF2,則l(F1)£ l(F2);若F1ÌF2,則l(F1)< l(F2)。
可以看出,隨著測(cè)試的進(jìn)行,故障被檢測(cè)并被排除,軟件的風(fēng)險(xiǎn)函數(shù)越來(lái)越少,其可靠性會(huì)越來(lái)越高。因此,軟件測(cè)試是發(fā)現(xiàn)軟件故障,提高軟件可靠性的重要手段。
【例1.1】 假設(shè)軟件中有5個(gè)錯(cuò)誤,每個(gè)錯(cuò)誤被檢測(cè)的概率分別為:q1=10-6,q2=10-7,q3=10-8,q4=10-9,q5=10-10,時(shí)間單位是秒。假設(shè)錯(cuò)誤的檢測(cè)與排除是按照從檢測(cè)概率大的到檢測(cè)概率小的依次進(jìn)行,因此,其對(duì)應(yīng)的風(fēng)險(xiǎn)函數(shù)和平均無(wú)故障時(shí)間分別為:
(1) 初始狀態(tài):l1=1.11´10-6,MTBF=31.25(天)(每天按8小時(shí)計(jì)算)
(2) 排除第一個(gè)故障后:l2=1.11´10-7,MTBF=312.5(天)
(3) 排除第二個(gè)故障后:l3=1.11´10-8,MTBF=3128.1(天)
(4) 排除第三個(gè)故障后:l4=1.11´10-9,MTBF=31565.7(天)
(5) 排除第四個(gè)故障后:l5=10-10,MTBF=347222.2(天)
1.10 影響軟件測(cè)試效率的因素
同其它任何一個(gè)產(chǎn)品相比,軟件的測(cè)試是更為復(fù)雜的,這主要是因?yàn)榈侥壳盀橹?,人們?duì)軟件的錯(cuò)誤發(fā)生的規(guī)律認(rèn)識(shí)的還不是很清楚,軟件測(cè)試也缺少有效的工具。影響軟件測(cè)試的效率的因素是很多的,除了測(cè)試方法之外,主要因素還有人為因素、軟件類(lèi)型、錯(cuò)誤類(lèi)型、測(cè)試充分度等。下面對(duì)這些因素進(jìn)行一些分析。
1.人為因素
在軟件測(cè)試缺少自動(dòng)化程度高的測(cè)試工具的前提下,軟件測(cè)試的許多工作是由人來(lái)完成的。因此,人的因素是影響測(cè)試效率的重要方面。Basili和Selby的實(shí)驗(yàn)數(shù)據(jù)清楚地揭示出了人為因素的作用。表1.3揭示了不同水平層次的測(cè)試人員在發(fā)現(xiàn)軟件錯(cuò)誤的數(shù)量和測(cè)試效率的差異。這里,階段1、2和3分別對(duì)應(yīng)單元測(cè)試、集成測(cè)試和系統(tǒng)測(cè)試。
表1.3 人為因素對(duì)測(cè)試效率的影響
測(cè)試者水平層次
階段
初級(jí)
中級(jí)
高級(jí)
平均值
標(biāo)準(zhǔn)差
平均值
標(biāo)準(zhǔn)差
平均值
標(biāo)準(zhǔn)差
發(fā)現(xiàn)錯(cuò)誤的個(gè)數(shù)
1
3.88
1.89
4.07
1.69
2
3.04
2.07
3.83
1.64
3
3.90
1.83
4.18
1.99
5.00
1.53
發(fā)現(xiàn)錯(cuò)誤的效率
1
1.36
0.97
2.22
1.66
2
1.00
0.85
0.96
0.74
3
2.14
2.48
2.53
2.48
2.36
1.61
2.軟件類(lèi)型
軟件類(lèi)型也是影響測(cè)試效率的一個(gè)重要因素,表1.4是Basili和Selby的實(shí)驗(yàn)數(shù)據(jù)。P1~P4代表了4個(gè)不同的程序。
表1.4 軟件類(lèi)型對(duì)測(cè)試效率的影響
程 序
階段
P1
P2
P3
P4
平均值
標(biāo)準(zhǔn)差
平均值
標(biāo)準(zhǔn)差
平均值
標(biāo)準(zhǔn)差
平均值
標(biāo)準(zhǔn)差
發(fā)現(xiàn)錯(cuò)誤的個(gè)數(shù)
1
4.07
1.62
3.48
1.45
4.28
2.25
2
3.23
2.20
3.31
1.97
3.31
1.84
3
4.19
1.73
5.22
1.75
3.41
1.66
發(fā)現(xiàn)錯(cuò)誤的效率
1
1.60
1.39
1.19
0.83
2.09
1.42
2
0.98
0.67
0.71
0.71
1.05
1.04
3
2.15
1.10
3.70
3.26
1.14
0.79
3.錯(cuò)誤類(lèi)型
各種不同的測(cè)試方法檢測(cè)不同錯(cuò)誤類(lèi)型的能力也是不同的。錯(cuò)誤的分類(lèi)方法目前有許多種,前邊已經(jīng)給出了比較詳細(xì)的分類(lèi)方法,為分析方便,下列分類(lèi)是其中的一種簡(jiǎn)單的分類(lèi)方法。
(1)初始化錯(cuò)誤:初始化代碼中的錯(cuò)誤;
(2)控制錯(cuò)誤:控制轉(zhuǎn)移的條件或轉(zhuǎn)移地址錯(cuò)誤;
(3)數(shù)據(jù)錯(cuò)誤:包括程序中的常數(shù)、數(shù)據(jù)庫(kù)中的數(shù)據(jù)錯(cuò)誤等;
(4)計(jì)算錯(cuò)誤:計(jì)算代碼錯(cuò)誤
(5)集成錯(cuò)誤:各模塊之間、軟件與環(huán)境之間的錯(cuò)誤
(6)容貌錯(cuò)誤:人機(jī)界面、打印格式等錯(cuò)誤。
圖1.10中是根據(jù)是Basili和Selby的實(shí)驗(yàn)數(shù)據(jù)整理的。
4.測(cè)試充分度
測(cè)試充分度是反映了在給定的測(cè)試方法下軟件被測(cè)試的程度。設(shè)M是給定的測(cè)試方法,在M下,軟件S應(yīng)被測(cè)試的元素的集合是T,而實(shí)際上被測(cè)試元素的集合為U,則U/T即是測(cè)試充分度。Frankl和Weiss發(fā)現(xiàn),只有當(dāng)測(cè)試的充分度接近100%時(shí),才能使測(cè)試發(fā)現(xiàn)錯(cuò)誤的能力得到發(fā)揮。如圖1.11所示。
1.11 軟件測(cè)試工具
軟件測(cè)試工具是提高軟件測(cè)試效率的重要手段,是軟件理論和技術(shù)發(fā)展的重要標(biāo)志。也是軟件測(cè)試技術(shù)從實(shí)驗(yàn)室走向產(chǎn)業(yè)的重要標(biāo)志。軟件測(cè)試工具是伴隨軟件測(cè)試技術(shù)的發(fā)展而發(fā)展的。目前,應(yīng)用比較廣泛的軟件測(cè)試工具有下列幾種類(lèi)型:
(1)測(cè)試設(shè)計(jì)工具:測(cè)試設(shè)計(jì)工具有助于準(zhǔn)備測(cè)試輸入或測(cè)試數(shù)據(jù)。測(cè)試設(shè)計(jì)工具包括邏輯設(shè)計(jì)工具和物理設(shè)計(jì)工具。邏輯設(shè)計(jì)工具涉及到說(shuō)明、接口或代碼邏輯,有時(shí)也叫做測(cè)試用例生成器。物理設(shè)計(jì)工具操作已有的數(shù)據(jù)或產(chǎn)生測(cè)試數(shù)據(jù)。如可以隨機(jī)從數(shù)據(jù)庫(kù)中抽取記錄的工具就是物理設(shè)計(jì)工具。從說(shuō)明中獲取測(cè)試數(shù)據(jù)的工具就是邏輯設(shè)計(jì)工具。
(2)測(cè)試管理工具:測(cè)試管理工具是指幫助完成測(cè)試計(jì)劃,跟蹤測(cè)試運(yùn)行結(jié)果等的工具。這類(lèi)工具還包括有助于需求、設(shè)計(jì)、編碼測(cè)試及缺陷跟蹤的工具。其代表工具有MI公司的Test Director, Rational公司的Test Manager, Compureware公司的TrackRecord等。
(3)靜態(tài)分析工具:靜態(tài)分析工具直接對(duì)代碼進(jìn)行分析,不需要運(yùn)行代碼,也不需要對(duì)代碼編譯鏈接,生成可執(zhí)行文件。靜態(tài)分析工具一般是對(duì)代碼進(jìn)行語(yǔ)法掃描,找出不符合編碼規(guī)范的地方,根據(jù)某種質(zhì)量模型評(píng)價(jià)代碼的質(zhì)量,生成系統(tǒng)的調(diào)用關(guān)系圖等。靜態(tài)分析工具的代表有Telelogic公司的Logiscope軟件,PR公司的PRQA軟件,Reasoning公司的Illuma軟件。
(4)動(dòng)態(tài)分析工具:動(dòng)態(tài)分析工具與靜態(tài)分析工具不同,動(dòng)態(tài)測(cè)試工具的一般采用“插樁”的方式,向代碼生成的可執(zhí)行文件中插入一些監(jiān)測(cè)代碼,用來(lái)統(tǒng)計(jì)程序運(yùn)行時(shí)的數(shù)據(jù)。其與靜態(tài)分析工具最大的不同就是動(dòng)態(tài)分析工具要求被測(cè)系統(tǒng)實(shí)際運(yùn)行。其代表有Compuware公司的DevPartner軟件、Rational公司的Purify系列產(chǎn)品。
(5)覆蓋測(cè)試工具:覆蓋工具評(píng)估通過(guò)一系列的測(cè)試,測(cè)試軟件被測(cè)試執(zhí)行的程度。覆蓋工具大量的用于單元測(cè)試中。例如,對(duì)于安全性要求高或與安全有關(guān)的系統(tǒng),則要求的覆蓋程度也較高。覆蓋工具還可以度量設(shè)計(jì)層次結(jié)構(gòu),如調(diào)用樹(shù)結(jié)構(gòu)的覆蓋率。如Telelogic公司的TestChecker測(cè)試軟件。
(6)負(fù)載和性能測(cè)試工具:性能測(cè)試工具檢測(cè)每個(gè)事件所需要的時(shí)間。例如,性能測(cè)試工具可以測(cè)定典型或負(fù)載條件下的響應(yīng)時(shí)間。負(fù)載測(cè)試可以產(chǎn)生系統(tǒng)流量。例如產(chǎn)生許多代表典型情況或最大情況下的事物。這種類(lèi)型的測(cè)試工具用于容量和壓力測(cè)試。專(zhuān)用于性能測(cè)試的工具有Radview公司的WebLoad、,icrosoft公司的WebStress,MI公司的LoadRunner等工具。
(7)GUI測(cè)試驅(qū)動(dòng)和捕獲/回放工具:這類(lèi)測(cè)試工具可使測(cè)試自動(dòng)執(zhí)行,然后將測(cè)試輸出結(jié)果與期望輸出進(jìn)行比較。此類(lèi)測(cè)試工具可在任何層次中執(zhí)行測(cè)試:?jiǎn)卧獪y(cè)試、集成測(cè)試、系統(tǒng)測(cè)試或驗(yàn)收測(cè)試。捕獲回放工具是目前使用的測(cè)試工具中最流行的一種。其代表有Rational公司的TeamTest、Robot,Compuware公司的QACenter,MI公司的WinRunner等。
(8)基于故障的測(cè)試工具:首先給出軟件的故障模型,在此故障模型下,給出基于該故障模型的軟件測(cè)試工具。這是目前一種有很好發(fā)展前景的軟件測(cè)試工具。隨著人們對(duì)軟件故障認(rèn)識(shí)的不斷深入,軟件的故障模型也會(huì)越來(lái)越完備,并更加符合實(shí)際?;诠收系能浖y(cè)試工具有三個(gè)需要研究的問(wèn)題:一是故障模型的準(zhǔn)確程度,二是測(cè)試的準(zhǔn)確程度,三是測(cè)試的自動(dòng)化程度。目前比較典型的是Rational公司的C++測(cè)試產(chǎn)品C—Inspector。
1.12 軟件測(cè)試技術(shù)的發(fā)展現(xiàn)狀
軟件測(cè)試技術(shù)是和程序聯(lián)系在一起的,自從有了程序,也就有了軟件測(cè)試。只不過(guò)是早期人們沒(méi)有認(rèn)識(shí)到這個(gè)問(wèn)題罷了。
早在二十世紀(jì)五十年代,英國(guó)著名的計(jì)算機(jī)科學(xué)家圖靈就曾給出了程序測(cè)試的原始定義:測(cè)試是正確性確認(rèn)的實(shí)驗(yàn)方法的一種極端形式。但在這個(gè)時(shí)期,程序一般是比較簡(jiǎn)單的,控制類(lèi)程序和計(jì)算類(lèi)程序是主要的,程序的規(guī)模一般在幾百~幾千行源代碼。程序設(shè)計(jì)者、編程人員和程序測(cè)試者一般都是一個(gè)人,測(cè)試者可以簡(jiǎn)單的根據(jù)程序的功能對(duì)程序進(jìn)行測(cè)試,并簡(jiǎn)單的根據(jù)結(jié)果的正確性來(lái)決定程序是否有錯(cuò)誤。由于程序規(guī)模小,一般程序的正確性也不存在大的什么問(wèn)題。
五十年代以后,隨著高級(jí)語(yǔ)言的誕生和廣泛應(yīng)用,軟件的規(guī)模急劇增大,就計(jì)算機(jī)科學(xué)本身來(lái)說(shuō),操作系統(tǒng)軟件、編譯軟件等一般都在數(shù)萬(wàn)行源代碼,而且由于這種軟件一般都是計(jì)算機(jī)系統(tǒng)運(yùn)行的核心,其正確性和可靠性的要求都比較高,傳統(tǒng)程序設(shè)計(jì)的思想和軟件不可靠性的矛盾日趨突出。于七十年代誕生的軟件工程技術(shù)是軟件發(fā)展的里程碑,它在某種程度上緩解了這個(gè)矛盾,但沒(méi)有從根本上解決問(wèn)題。
七十年代中期以后,是軟件測(cè)試技術(shù)發(fā)展的最活躍的時(shí)期。Brooks總結(jié)了開(kāi)發(fā)IBM OS/360操作系統(tǒng)中的經(jīng)驗(yàn),在著名的《神秘的人—月》一書(shū)中闡明了軟件測(cè)試在研制大系統(tǒng)中的重要意義。1975年,美國(guó)黃榮昌教授在論文中討論了測(cè)試準(zhǔn)則、測(cè)試過(guò)程、路徑謂詞、測(cè)試數(shù)據(jù)及其生成問(wèn)題,首次全面系統(tǒng)地論述了軟件測(cè)試的有關(guān)問(wèn)題。Hetzel在1975年整理出版了《Program Test Methods》一書(shū),書(shū)中縱覽了測(cè)試方法及各種自動(dòng)測(cè)試工具,這是專(zhuān)題論述軟件測(cè)試的第一本著作。Goodenough和Gerhart首次提出了軟件測(cè)試的理論,從而把軟件測(cè)試這一實(shí)踐性很強(qiáng)的學(xué)科提高到理論的高度,被認(rèn)為是測(cè)試技術(shù)發(fā)展過(guò)程中具有開(kāi)創(chuàng)性的工作。此后不久,著名測(cè)試專(zhuān)家Howden指出了上述理論的缺陷,并進(jìn)行了新的開(kāi)創(chuàng)性工作。以后,Weyuker,Ostrand,Geller和Gerhart等進(jìn)一步總結(jié)原有的測(cè)試?yán)碚摬⑦M(jìn)一步加以完善,使軟件測(cè)試成為有理論指導(dǎo)的實(shí)踐性學(xué)科。
在軟件測(cè)試?yán)碚撗杆侔l(fā)展的同時(shí),各種軟件測(cè)試方法也應(yīng)運(yùn)而生。黃榮昌提出了程序插裝測(cè)試技術(shù);Howden在路徑分析的基礎(chǔ)上,提出了系統(tǒng)功能測(cè)試和代數(shù)測(cè)試的概念;Howden、Clarke和Darringer等人提出了符號(hào)測(cè)試方法,并建立了DISSET符號(hào)測(cè)試系統(tǒng);Demillo提出了程序變異測(cè)試方法;Osterweil和Fosdick提出了數(shù)據(jù)流測(cè)試方法;White和Cohen提出了域測(cè)試方法;Richardson和Clarke提出了劃分測(cè)試方法??傊呤甏涟耸甏?,是軟件測(cè)試技術(shù)迅速發(fā)展的時(shí)期,數(shù)十種軟件測(cè)試方法被提出,軟件測(cè)試技術(shù)已迅速發(fā)展成為一個(gè)獨(dú)立的學(xué)科。
但總體來(lái)看,七十年代至八十年代,軟件測(cè)試技術(shù)的研究主要是在理論上。實(shí)用的軟件測(cè)試系統(tǒng)并不多見(jiàn),少數(shù)的測(cè)試系統(tǒng)由于測(cè)試效率不高,也難以進(jìn)入市場(chǎng)。
進(jìn)入二十世紀(jì)九十年代,隨著計(jì)算機(jī)技術(shù)的日趨普及,軟件的應(yīng)用范圍逐步擴(kuò)大,一些關(guān)系到國(guó)際民生的行業(yè)、關(guān)系到國(guó)家安全的重要部門(mén)已變得越來(lái)越依賴(lài)軟件。軟件的規(guī)模在大幅度的擴(kuò)大,軟件的復(fù)雜性在大幅度的提高,由于軟件測(cè)試技術(shù)的發(fā)展遠(yuǎn)遠(yuǎn)落后于軟件技術(shù)的發(fā)展,軟件不可靠性的矛盾變得更加突出。因此,進(jìn)入九十年代,軟件的質(zhì)量與可靠性已引起了政府和社會(huì)的廣泛重視,各種實(shí)用的軟件測(cè)試系統(tǒng)不斷涌現(xiàn),軟件測(cè)試產(chǎn)品也逐步的進(jìn)入市場(chǎng),專(zhuān)門(mén)從事軟件測(cè)試的公司也相繼出現(xiàn),這為保證軟件的質(zhì)量與可靠性奠定了重要基礎(chǔ)。進(jìn)入2000年以來(lái),我國(guó)軟件測(cè)試技術(shù)發(fā)展極為迅速,全國(guó)目前大約有100余家軟件評(píng)測(cè)中心,軟件測(cè)試的從業(yè)人員有數(shù)千人,2003年軟件測(cè)試的產(chǎn)值達(dá)到了數(shù)億人民幣。
在軟件測(cè)試技術(shù)的學(xué)術(shù)領(lǐng)域,1982年,在美國(guó)北卡羅來(lái)納大學(xué)召開(kāi)了首屆軟件測(cè)試的正式學(xué)術(shù)會(huì)議,之后,該學(xué)術(shù)會(huì)議每?jī)赡暾匍_(kāi)一次,此外,國(guó)際上還有軟件可靠性會(huì)議,從會(huì)議的規(guī)模和論文的數(shù)量與質(zhì)量上看,從事軟件測(cè)試技術(shù)的人員在大幅度的增加。我國(guó)目前雖然沒(méi)有專(zhuān)門(mén)的軟件測(cè)試的學(xué)術(shù)組織,但目前在容錯(cuò)計(jì)算專(zhuān)業(yè)委員會(huì)的學(xué)術(shù)會(huì)議上、全國(guó)測(cè)試學(xué)術(shù)會(huì)議上都能受到大量的軟件測(cè)試技術(shù)的學(xué)術(shù)論文。2004年8月,在青海省西寧市召開(kāi)了全國(guó)首屆軟件測(cè)試技術(shù)研討會(huì),2007年,將在昆明召開(kāi)第二屆全國(guó)軟件測(cè)試技術(shù)研討會(huì)。
可以預(yù)測(cè),在未來(lái)的時(shí)間里,軟件測(cè)試技術(shù)與行業(yè)將會(huì)得到更快的發(fā)展,主要可能的表現(xiàn)包括:軟件測(cè)試?yán)碚摳油晟?,測(cè)試效率更加提高;更實(shí)用的軟件測(cè)試系統(tǒng)將會(huì)大量出現(xiàn);更多的專(zhuān)門(mén)從事軟件測(cè)試與可靠性評(píng)估的公司將會(huì)誕生。