摘 要:開發(fā)過程中一次性開發(fā)成功或者無錯(cuò)誤發(fā)生的幾率為零,因此在軟件的開發(fā)過程中需要不斷的完善,而這個(gè)不斷完善修改的過程就是軟件測試的過程。軟件測試也代表了了設(shè)計(jì)、編碼的最終復(fù)審。著重論述了目前軟件工程中普遍存在的一些測試問題,并對其產(chǎn)生的原因進(jìn)行了詳細(xì)的分析。介紹了軟件測試的本質(zhì),同時(shí)對目前流行的測試方法進(jìn)行了研究,提出了不同類型的軟件最佳的測試方案。
關(guān)鍵詞:軟件可靠性;軟件質(zhì)量;軟件測試;測試用例
中圖分類號:TP文獻(xiàn)標(biāo)識(shí)碼:A文章編號:1672-3198(2008)09-0343-02
1 概述
信息技術(shù)的飛速發(fā)展,使軟件產(chǎn)品應(yīng)用到社會(huì)的各個(gè)領(lǐng)域,軟件產(chǎn)品的質(zhì)量自然成為人們共同關(guān)注的焦點(diǎn)。軟件開發(fā)商為了占有市場,必須把產(chǎn)品質(zhì)量作為企業(yè)的重要目標(biāo)之一,以免在激烈的競爭中被淘汰。用戶為了保證自己業(yè)務(wù)的順利完成,總是希望選用優(yōu)質(zhì)的軟件。質(zhì)量不佳的軟件產(chǎn)品不僅會(huì)使開發(fā)商的維護(hù)費(fèi)用和用戶的使用成本大幅增加,還可能產(chǎn)生其他的責(zé)任風(fēng)險(xiǎn),在一些關(guān)鍵應(yīng)用,如民航訂票系統(tǒng)、銀行結(jié)算系統(tǒng)、證券交易系統(tǒng)等中使用質(zhì)量有問題的軟件,還可能造成災(zāi)難性的后果。
軟件危機(jī)曾經(jīng)是軟件界甚至整個(gè)計(jì)算機(jī)界最熱門的話題,為了解決這個(gè)危機(jī),軟件從業(yè)人員、專家和學(xué)者做出了大量的努力。現(xiàn)在人們已經(jīng)逐步認(rèn)識(shí)到所謂的軟件危機(jī)實(shí)際上僅是一種狀況,那就是軟件中有錯(cuò)誤,正是這些錯(cuò)誤導(dǎo)致了軟件開發(fā)在成本、進(jìn)度和質(zhì)量上的失控。有錯(cuò)是軟件的屬性,而且是無法改變的。因?yàn)檐浖怯扇藖硗瓿傻模杏扇俗龅墓ぷ鞫疾粫?huì)是完美無缺的。問題在于應(yīng)該如何去避免錯(cuò)誤的產(chǎn)生和消除已經(jīng)產(chǎn)生的錯(cuò)誤,使程序中的錯(cuò)誤密度達(dá)到盡可能低的程度。
軟件工程學(xué)出現(xiàn)后,軟件開發(fā)被視為一項(xiàng)工程,以工程化的方法來進(jìn)行規(guī)劃和管理軟件的開發(fā)。事實(shí)上,不論采用什么技術(shù)和什么方法,軟件中出現(xiàn)錯(cuò)誤總是難免的。采用新的語言、先進(jìn)的開發(fā)方式、完善的開發(fā)過程,可以減少錯(cuò)誤的引入,但是不可能完全杜絕軟件中的錯(cuò)誤,這些引入的錯(cuò)誤需要測試來找出。測試是軟件開發(fā)的重要部分。統(tǒng)計(jì)表明,在典型的軟件開發(fā)項(xiàng)目中,軟件測試工作量往往占軟件開發(fā)總工作量的40%以上。而在軟件開發(fā)的總成本中用在測試上的開銷要占30%到50%。如果把維護(hù)階段也考慮在內(nèi),討論整個(gè)軟件生存時(shí)期時(shí),測試的成本比例也許會(huì)有所降低,但實(shí)際上維護(hù)工作相當(dāng)于二次開發(fā),仍至多次開發(fā),其中必定還包含有許多測試工作。系統(tǒng)的問題越早發(fā)現(xiàn),改正成本越低,破壞性越小,所以,在系統(tǒng)發(fā)布前要盡量多地把系統(tǒng)問題找出來,其手段就是有計(jì)劃、有組織地進(jìn)行充分的測試。
軟件測試是根據(jù)軟件開發(fā)各階段的規(guī)格說明和程序的內(nèi)部結(jié)構(gòu)而精心設(shè)計(jì)一組測試數(shù)據(jù),并利用這些測試數(shù)據(jù)運(yùn)行程序,以發(fā)現(xiàn)程序錯(cuò)誤的過程。根據(jù)測試數(shù)據(jù)設(shè)計(jì)方法,軟件測試可分為結(jié)構(gòu)測試和功能測試。在結(jié)構(gòu)測試過程中,測試者對程序的語句、分支和邏輯路徑進(jìn)行各種覆蓋測試,可以在不同點(diǎn)檢查程序的狀態(tài),以確定實(shí)際狀態(tài)與預(yù)期狀態(tài)是否一致。軟件測試的目的是發(fā)現(xiàn)錯(cuò)誤,而不是確認(rèn)其正確性,而對已進(jìn)行的測試過程的程度進(jìn)行評估。
2 測試方法
2.1 軟件測試實(shí)質(zhì)
軟件測試是一項(xiàng)邏輯性強(qiáng)、且極具條理的工作,也是具有風(fēng)險(xiǎn)性的行為。由于軟件的輸入量、輸出結(jié)果、軟件實(shí)現(xiàn)途徑都很多,而且軟件產(chǎn)品說明書沒有客觀的標(biāo)準(zhǔn),導(dǎo)致從不同的角度看,軟件缺陷的標(biāo)準(zhǔn)不同,因而無法對軟件實(shí)施完全測試,這樣,就無法通過軟件測試顯示隱藏的軟件缺陷,只能盡量查找軟件缺陷,找到的軟件缺陷越多,說明軟件本身的缺陷就越多,況且還有一些是未發(fā)現(xiàn)、不能斷定的缺陷,這就是軟件測試的局限性。軟件測試與軟件開發(fā)過程的關(guān)系如圖1所示。

所有的軟件測試都有2個(gè)關(guān)鍵的問題組成:建立能測試應(yīng)用程序的環(huán)境,并在該環(huán)境中測試軟件能力。測試員必須理解和重新生成軟件所在的復(fù)雜軟件環(huán)境,并運(yùn)用其能力確保正常的測試。
2.2 軟件測試手段
從測試是否針對系統(tǒng)的內(nèi)部結(jié)構(gòu)和具體實(shí)現(xiàn)算法的角度來看,可分為白盒測試和黑盒測試。
2.2.1 黑盒測試
黑盒測試也稱功能測試或數(shù)據(jù)驅(qū)動(dòng)測試,它是在已知產(chǎn)品所應(yīng)具有的功能情況下,通過測試來檢測每個(gè)功能是否都能正常使用。在測試時(shí),把程序看作一個(gè)不能打開的黑盒子,在完全不考慮程序內(nèi)部結(jié)構(gòu)和內(nèi)部特性的情況下,測試者在程序接口進(jìn)行測試,它只檢查程序功能是否按照需求規(guī)格說明書的規(guī)定正常使用,程序是否能適當(dāng)?shù)亟邮蛰斎霐?shù)據(jù)而產(chǎn)生正確的輸出信息并且保持外部信息(如:數(shù)據(jù)庫或文件)的完整性。黑盒法著眼于程序外部結(jié)構(gòu),不考慮內(nèi)部邏輯結(jié)構(gòu),只針對軟件界面和軟件功能進(jìn)行測試,它主要用于軟件驗(yàn)收測試。黑盒法是窮舉輸入測試,只有把所有可能的輸入都作為測試情況使用,才能以這種方法查出程序中所有的錯(cuò)誤。測試情況實(shí)際上有無窮多個(gè),人們不僅要測試所有合法的輸入,而且還要對那些不合法但是可能的輸入進(jìn)行測試。
2.2.2 白盒測試
白盒測試也稱結(jié)構(gòu)測試或邏輯驅(qū)動(dòng)測試,它是在已知產(chǎn)品內(nèi)部工作過程情況下,通過測試來檢測產(chǎn)品內(nèi)部動(dòng)作是否按照規(guī)格說明書的規(guī)定正常進(jìn)行,按照程序內(nèi)部的結(jié)構(gòu)測試程序,檢驗(yàn)程序中的每條通路是否都能按預(yù)定要求正確工作,而不顧它的功能。白盒測試的主要方法有邏輯驅(qū)動(dòng)、基路測試等,白盒法是窮舉路徑測試,主要用于軟件驗(yàn)證。
(1)軟件有產(chǎn)品說明書時(shí),對產(chǎn)品說明書實(shí)施測試和審查:由于軟件產(chǎn)品說明書屬于文檔,因此對產(chǎn)品說明書的測試是黑盒測試。在實(shí)施測試時(shí)要弄清所開發(fā)軟件的客戶,并熟悉現(xiàn)有的標(biāo)準(zhǔn)和規(guī)范,基于同類軟件測試的經(jīng)驗(yàn)進(jìn)行測試。除了這些,如果時(shí)間和條件允許,應(yīng)該對產(chǎn)品說明書進(jìn)行審查,按照相關(guān)的標(biāo)準(zhǔn),看產(chǎn)品說明書是否符合要求。這都是通常的一些做法,當(dāng)然還可以采用其他軟件檢測方法。
(2)由于當(dāng)前軟件開發(fā)有時(shí)不是很正規(guī),在沒有產(chǎn)品說明書時(shí)應(yīng)使用試探性測試:首先要分步驟地弄清軟件特性,記錄軟件運(yùn)行情況,詳細(xì)描述軟件功能,然后運(yùn)用靜態(tài)和動(dòng)態(tài)黑盒測試兩種方式來測試軟件,發(fā)現(xiàn)軟件缺陷,在這種情況下,可以將一些非法、錯(cuò)誤和垃圾數(shù)據(jù)作為輸入數(shù)據(jù),以檢驗(yàn)軟件的輸出結(jié)果。測試時(shí)可采用反復(fù)測試、邊界值測試和不合條件等方法。
(3)對有些軟件實(shí)施狀態(tài)測試:首先是熟悉軟件的邏輯流程,可能的話,建立狀態(tài)轉(zhuǎn)換圖,盡量清晰地描繪軟件可能的獨(dú)立狀態(tài),從一種狀態(tài)到另一種狀態(tài)所允許的輸入和條件,以及進(jìn)入或退出某種狀態(tài)時(shí)的設(shè)置條件和輸出結(jié)果;如果要測試的軟件規(guī)模較大、復(fù)雜性較高,那么建立狀態(tài)轉(zhuǎn)換圖將是非常艱巨的任務(wù),這時(shí)減少要測試的狀態(tài)及狀態(tài)的數(shù)量,但是必須保證每種狀態(tài)都必須測試一次,也可以在狀態(tài)測試時(shí)選擇那些不常用的分支,因?yàn)檫@是最容易被忽略的。在此基礎(chǔ)上,測試所有的錯(cuò)誤狀態(tài)及返回值,測試隨機(jī)狀態(tài)轉(zhuǎn)換。
(4)在前述測試的基礎(chǔ)上,對有些測試實(shí)施失敗狀態(tài)測試:具體在實(shí)施時(shí),指的是幾個(gè)時(shí)間對某一資源競爭使用,比如:
①兩個(gè)不同的程序同時(shí)保持或打開同一個(gè)文檔。
②共享同一臺(tái)外圍設(shè)備。
③當(dāng)軟件處于讀取或者修改狀態(tài)時(shí)按鍵或者單擊鼠標(biāo)。
④同時(shí)關(guān)閉或者啟動(dòng)同一個(gè)軟件的多個(gè)實(shí)例。
⑤使用不同的程序同時(shí)訪問同一個(gè)數(shù)據(jù)庫。
類似這樣的競爭條件還有很多,不一一舉例。
(5)在實(shí)際測試時(shí)還常用反復(fù)、壓迫和重負(fù)測試,實(shí)施這些測試的目的是考驗(yàn)軟件在惡劣條件下是否能正常運(yùn)行和退出,從而驗(yàn)證軟件的性能。反復(fù)測試指的是不斷地執(zhí)行同樣的操作;壓迫測試是使用軟件在不夠理想的條件下運(yùn)行,從而觀察軟件對外部資源的要求和依賴程度,借此來測試軟件的性能;重負(fù)測試是指盡量提供條件任其發(fā)揮,讓軟件處理盡可能大的數(shù)據(jù)文件,即最大限度地發(fā)掘軟件的能力,使之不堪重負(fù),大多數(shù)情況下,用時(shí)間作為參數(shù)實(shí)施重負(fù)測試,看其在重負(fù)情況下能否正常運(yùn)行。實(shí)際測試時(shí),常將三種測試方法結(jié)合起來使用。
(6)測試軟件的另一種有效方法就是進(jìn)行正式審查,其中包括以下幾個(gè)方面:確定問題、制定審查規(guī)則、準(zhǔn)備工作以及編寫報(bào)告,進(jìn)行審查的主要方法就是組織熟悉該類軟件的人員逐一檢查代碼,其中重要的軟件還需要按能力成熟度(CMM)中的要求進(jìn)行同行評審。
(7)在實(shí)際測試中經(jīng)常采用一種稱之為動(dòng)態(tài)白盒測試的方法,其意義是指利用查看代碼功能和實(shí)現(xiàn)方式得到的信息來確定哪些要測試,哪些不需要測試,以及如何開展測試。其中不僅是查看代碼,還包括直接測試和控制軟件。包括以下幾個(gè)部分:
①直接測試底層功能、過程、子程序和庫。
②根據(jù)軟件運(yùn)行的實(shí)際情況不斷地調(diào)整測試用例。
③對軟件中的部分變量和狀態(tài)信息進(jìn)行訪問,確定測試與預(yù)期結(jié)果是否相符,并強(qiáng)制軟件以正常測試難以實(shí)現(xiàn)的方式運(yùn)行。在具體實(shí)施時(shí)應(yīng)分階段地進(jìn)行測試,即遵循單元測試、集成測試、配置項(xiàng)測試和系統(tǒng)測試的步驟。目前,灰盒測試逐漸為大家認(rèn)同,灰盒測試綜合了白盒測試和黑盒測試的優(yōu)點(diǎn),模糊了兩者的界限,在做法上仍然把軟件當(dāng)成黑盒來測試,但是通過簡單地查看(不像白盒那樣進(jìn)行完整地查看)軟件內(nèi)部工作機(jī)制作為補(bǔ)充。現(xiàn)在的網(wǎng)頁制作就很適合灰盒測試。
3 結(jié)束語
軟件測試的目的不是為了僅僅找出錯(cuò)誤,而是通過它發(fā)現(xiàn)錯(cuò)誤、分析錯(cuò)誤,找到錯(cuò)誤的分布特征和規(guī)律,從而幫助項(xiàng)目管理人員發(fā)現(xiàn)當(dāng)前所采用的軟件開發(fā)過程的缺陷,以便改進(jìn);同時(shí)也能夠通過設(shè)計(jì)有針對性的檢測方法,改善軟件測試的有效性。即使測試沒有發(fā)現(xiàn)任何錯(cuò)誤,也是十分有價(jià)值的,因?yàn)橥暾臏y試不僅可以給軟件質(zhì)量進(jìn)行一個(gè)正確的評價(jià),而且是提高軟件質(zhì)量的重要方法之一。
參考文獻(xiàn)
[1]史濟(jì)民.軟件工程原理方法與應(yīng)用[M].北京:高等教育出版社,2001.
[2]張海藩.軟件工程導(dǎo)論[M].北京:清華大學(xué)出版社,1997.