第結(jié)構(gòu)化實(shí)現(xiàn)_第1頁(yè)
第結(jié)構(gòu)化實(shí)現(xiàn)_第2頁(yè)
第結(jié)構(gòu)化實(shí)現(xiàn)_第3頁(yè)
第結(jié)構(gòu)化實(shí)現(xiàn)_第4頁(yè)
第結(jié)構(gòu)化實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩108頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

會(huì)計(jì)學(xué)1第結(jié)構(gòu)化實(shí)現(xiàn)

僅就測(cè)試而言,它的目標(biāo)是發(fā)現(xiàn)軟件中的錯(cuò)誤,但是,發(fā)現(xiàn)錯(cuò)誤并不是我們的最終目的。軟件工程的根本目標(biāo),是開(kāi)發(fā)出高質(zhì)量的完全符合用戶需要的軟件產(chǎn)品,因此,通過(guò)測(cè)試發(fā)現(xiàn)軟件錯(cuò)誤之后還必須診斷并改正錯(cuò)誤,這就是調(diào)試(也稱(chēng)為糾錯(cuò))的任務(wù)。調(diào)試是測(cè)試階段最困難的工作。在對(duì)測(cè)試結(jié)果進(jìn)行收集和評(píng)價(jià)的時(shí)候,軟件產(chǎn)品所達(dá)到的可靠性也逐漸明朗了。軟件可靠性模型使用故障率數(shù)據(jù),預(yù)測(cè)軟件的可靠性。

第1頁(yè)/共113頁(yè)4.1編

碼4.2軟件測(cè)試概述4.3白盒測(cè)試技術(shù)4.4黑盒測(cè)試技術(shù)4.5測(cè)試策略4.6調(diào)試4.7軟件可靠性4.8小結(jié)第2頁(yè)/共113頁(yè)4.1編

碼4.1.1選擇適當(dāng)?shù)某绦蛟O(shè)計(jì)語(yǔ)言程序設(shè)計(jì)語(yǔ)言是人和計(jì)算機(jī)通信的基本工具,它的特點(diǎn)不可避免地會(huì)影響人思維和解決問(wèn)題的方式,會(huì)影響人和計(jì)算機(jī)通信的方式和質(zhì)量,也會(huì)影響其他人閱讀和理解程序的難易程度。因此,編碼之前的一項(xiàng)重要工作就是選擇一種適當(dāng)?shù)某绦蛟O(shè)計(jì)語(yǔ)言。適當(dāng)?shù)某绦蛟O(shè)計(jì)語(yǔ)言能使程序員在根據(jù)設(shè)計(jì)編碼時(shí)遇到的困難最少,可以減少需要的程序測(cè)試量,并且可以寫(xiě)出更容易閱讀和更容易維護(hù)的程序。由于軟件系統(tǒng)的絕大部分成本用在生命周期的測(cè)試和維護(hù)階段,因此容易測(cè)試和容易維護(hù)是極端重要的。返回目錄第3頁(yè)/共113頁(yè)

總的說(shuō)來(lái)。高級(jí)語(yǔ)言明顯優(yōu)于匯編語(yǔ)言,因此,除了在很特殊的應(yīng)用領(lǐng)域(例如,對(duì)程度執(zhí)行時(shí)間和使用的空間都有很?chē)?yán)格限制的情況;需要產(chǎn)生任意的甚至非法的指令序列;體系結(jié)構(gòu)特殊的微處理機(jī),以致在這類(lèi)機(jī)器上通常不能實(shí)現(xiàn)高級(jí)語(yǔ)言編譯程序),或者大型系統(tǒng)中執(zhí)行時(shí)間非常關(guān)鍵的(或直接依賴(lài)于硬件的)一小部分代碼需要用匯編語(yǔ)言書(shū)寫(xiě)之外,其他程序應(yīng)該一律用高級(jí)語(yǔ)言書(shū)寫(xiě)。為了使程序容易測(cè)試和維護(hù)以減少生命周期的總成本,選用的高級(jí)語(yǔ)言應(yīng)該有理想的模塊化機(jī)制,以及可讀性好的控制結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu);為了便于調(diào)試和提高軟件可靠性,語(yǔ)言特點(diǎn)應(yīng)該使編譯程序能夠盡可能多地發(fā)現(xiàn)程序中的錯(cuò)誤;為了降低軟件開(kāi)發(fā)和維護(hù)的成本,選用的語(yǔ)言應(yīng)該有良好的獨(dú)立編譯機(jī)制。上述這些要求是選擇語(yǔ)言的理想標(biāo)準(zhǔn),但是在實(shí)際選用語(yǔ)言時(shí)不能僅僅考慮理論上的標(biāo)準(zhǔn),還必須同時(shí)考慮實(shí)用方面的各種限制。

第4頁(yè)/共113頁(yè)4.1.2正確的編碼風(fēng)格雖然選取了好的程序設(shè)計(jì)語(yǔ)言有助于寫(xiě)出既可靠又容易閱讀、容易維護(hù)的程序,但是,工具再好使用不當(dāng)也不會(huì)達(dá)到預(yù)期的效果。按照軟件工程方法學(xué)開(kāi)發(fā)軟件,程序是表達(dá)軟件設(shè)計(jì)結(jié)果的一種更具體的形式,程序的質(zhì)量基本上由設(shè)計(jì)的質(zhì)量決定,但是,編碼風(fēng)格也在很大程度上決定著程序的質(zhì)量。所謂編碼風(fēng)格就是程序員在編寫(xiě)程序時(shí)遵循的具體準(zhǔn)則和習(xí)慣做法。源程序代碼的邏輯簡(jiǎn)明清晰、易讀易懂是好程序的一個(gè)重要標(biāo)準(zhǔn),為了寫(xiě)出好程序應(yīng)該遵循下述規(guī)則。第5頁(yè)/共113頁(yè)1.程序內(nèi)部必須有正確的文檔所謂程序內(nèi)部的文檔包括恰當(dāng)?shù)臉?biāo)識(shí)符、適當(dāng)?shù)淖⒔夂统绦虻囊曈X(jué)組織等等。選取含義鮮明的名字,使它能正確地提示程序?qū)ο笏淼膶?shí)體,這對(duì)于幫助閱讀者理解程序是很重要的。如果使用縮寫(xiě),那么縮寫(xiě)規(guī)則應(yīng)該一致,并且應(yīng)該給每個(gè)名字加注解。第6頁(yè)/共113頁(yè)

注解是程序員和程序讀者通信的重要手段,正確的注解非常有助于對(duì)程序的理解。通常在每個(gè)模塊開(kāi)始處有一段序言性的注解,簡(jiǎn)要描述模塊的功能、主要算法、接口特點(diǎn)、重要數(shù)據(jù)以及開(kāi)發(fā)簡(jiǎn)史。插在程序中間與一段程序代碼有關(guān)的注解,主要解釋包含這段代碼的必要性。對(duì)于用高級(jí)語(yǔ)言書(shū)寫(xiě)的源程序,不需要用注解的形式把每個(gè)語(yǔ)句翻譯成自然語(yǔ)言,應(yīng)該利用注解提供一些額外的信息。應(yīng)該用空格或空行清楚地區(qū)分注解和程序。注解的內(nèi)容一定要正確,錯(cuò)誤的注解不僅對(duì)理解程序毫無(wú)幫助,反而會(huì)妨礙對(duì)程序的理解。程序清單的布局對(duì)于程序的可讀性也有很大影響,應(yīng)該利用適當(dāng)?shù)碾A梯形式使程序的層次結(jié)構(gòu)清晰明顯。第7頁(yè)/共113頁(yè)2.數(shù)據(jù)說(shuō)明應(yīng)便于查閱易于理解雖然在設(shè)計(jì)期間已經(jīng)確定了數(shù)據(jù)結(jié)構(gòu)的組織和復(fù)雜程度,然而數(shù)據(jù)說(shuō)明的風(fēng)格卻是在寫(xiě)程序時(shí)確定的。為了使數(shù)據(jù)更容易理解和維護(hù),有一些比較簡(jiǎn)單的原則應(yīng)該遵循。數(shù)據(jù)說(shuō)明的次序應(yīng)該標(biāo)準(zhǔn)化(例如,按照數(shù)據(jù)結(jié)構(gòu)或數(shù)據(jù)類(lèi)型確定說(shuō)明的次序)。有次序就容易查閱,因此能夠加速測(cè)試、調(diào)試和維護(hù)的過(guò)程。當(dāng)多個(gè)變量名在一個(gè)語(yǔ)句中說(shuō)明時(shí),應(yīng)該按字母順序排列這些變量。如果設(shè)計(jì)時(shí)使用了一個(gè)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),則應(yīng)該用注解說(shuō)明用程序設(shè)計(jì)語(yǔ)言實(shí)現(xiàn)這個(gè)數(shù)據(jù)結(jié)構(gòu)的方法和特點(diǎn)。第8頁(yè)/共113頁(yè)3.語(yǔ)句應(yīng)該盡量簡(jiǎn)單清晰設(shè)計(jì)期間確定了軟件的邏輯結(jié)構(gòu),然而個(gè)別語(yǔ)句的構(gòu)造卻是編寫(xiě)程序的一個(gè)主要任務(wù)。構(gòu)造語(yǔ)句時(shí)應(yīng)該遵循的原則是,每個(gè)語(yǔ)句都應(yīng)該簡(jiǎn)單而直接,不能為了提高效率而使程序變得過(guò)分復(fù)雜。下述規(guī)則有助于使語(yǔ)句簡(jiǎn)單明了:●不要為了節(jié)省空間而把多個(gè)語(yǔ)句寫(xiě)在同一行;●盡量避免復(fù)雜的條件測(cè)試;●盡量減少對(duì)“非”條件的測(cè)試;●避免大量使用循環(huán)嵌套和條件嵌套;●利用括號(hào)使邏輯表達(dá)式或算術(shù)表達(dá)式的運(yùn)算次序清晰直觀。第9頁(yè)/共113頁(yè)4.正確的輸入/輸出風(fēng)格在設(shè)計(jì)和編寫(xiě)程序時(shí)應(yīng)該考慮下述有關(guān)輸入/輸出風(fēng)格的規(guī)則:●對(duì)所有輸入數(shù)據(jù)都進(jìn)行檢驗(yàn);●檢查輸入項(xiàng)重要組合的合法性;●保持輸入格式簡(jiǎn)單;●使用數(shù)據(jù)結(jié)束標(biāo)記,不要求用戶指定數(shù)據(jù)的數(shù)目;●明確提示交互式輸入的請(qǐng)求,詳細(xì)說(shuō)明可用的選擇或邊界數(shù)值;●當(dāng)程序設(shè)計(jì)語(yǔ)言對(duì)格式有嚴(yán)格要求時(shí),應(yīng)保持輸入格式一致;●設(shè)計(jì)良好的輸出報(bào)表;●給所有輸出數(shù)據(jù)加標(biāo)志。第10頁(yè)/共113頁(yè)5.不要盲目追求高效率效率主要指處理機(jī)時(shí)間和存儲(chǔ)器容量?jī)蓚€(gè)方面。雖然值得提出提高效率的要求,但是在進(jìn)一步討論這個(gè)問(wèn)題之前應(yīng)該記住三條原則:首先,效率是性能要求,因此應(yīng)該在需求分析階段確定效率方面的要求。軟件應(yīng)該像對(duì)它要求的那樣有效,而不應(yīng)該如同人類(lèi)可能做到的那樣有效。其次,效率是靠好設(shè)計(jì)來(lái)提高的。第三,程序的效率和程序的簡(jiǎn)單程度是一致的。不要犧牲程序的清晰性和可讀性來(lái)不必要地提高效率。

第11頁(yè)/共113頁(yè)4.2軟件測(cè)試概述測(cè)試階段的目標(biāo)測(cè)試的基本原則測(cè)試的基本步驟靜態(tài)分析與動(dòng)態(tài)測(cè)試返回目錄第12頁(yè)/共113頁(yè)軟件測(cè)試的目標(biāo)什么是測(cè)試?它的目標(biāo)是什么?G.Myers給出了關(guān)于測(cè)試的一些規(guī)則,這些規(guī)則也可以看作是測(cè)試的目標(biāo)或定義:(1)測(cè)試是為了發(fā)現(xiàn)程序中的錯(cuò)誤而執(zhí)行程序的過(guò)程;(2)好的測(cè)試方案是極可能發(fā)現(xiàn)迄今為止尚未發(fā)現(xiàn)的錯(cuò)誤的測(cè)試方案;(3)成功的測(cè)試是發(fā)現(xiàn)了至今為止尚未發(fā)現(xiàn)的錯(cuò)誤的測(cè)試。

第13頁(yè)/共113頁(yè)完全測(cè)試是不可能的軟件測(cè)試時(shí)有風(fēng)險(xiǎn)的活動(dòng)測(cè)試無(wú)法顯示潛伏的軟件缺陷和故障充分注意測(cè)試中的群集現(xiàn)象殺蟲(chóng)劑現(xiàn)象并非所有的軟件缺陷都要修復(fù)軟件測(cè)試必須有預(yù)期結(jié)果盡早地、不斷地進(jìn)行軟件測(cè)試程序員應(yīng)該避免檢查自己的程序測(cè)試的基本原則第14頁(yè)/共113頁(yè)軟件測(cè)試的基本步驟單元測(cè)試集成測(cè)試確認(rèn)測(cè)試系統(tǒng)測(cè)試驗(yàn)收測(cè)試第15頁(yè)/共113頁(yè)靜態(tài)分析與動(dòng)態(tài)測(cè)試靜態(tài)方法桌前檢查代碼會(huì)審步行檢查調(diào)用圖數(shù)據(jù)流分析圖第16頁(yè)/共113頁(yè)4.2.3兩類(lèi)測(cè)試方法怎樣對(duì)程序進(jìn)行測(cè)試呢?測(cè)試任何產(chǎn)品都有兩種方法:如果已經(jīng)知道了產(chǎn)品應(yīng)該具有的功能,可以通過(guò)測(cè)試來(lái)檢驗(yàn)是否每個(gè)功能都能正常使用;如果知道產(chǎn)品內(nèi)部預(yù)定的工作過(guò)程,可以通過(guò)測(cè)試來(lái)檢驗(yàn)產(chǎn)品內(nèi)部動(dòng)作是否按照規(guī)格說(shuō)明書(shū)的規(guī)定正常進(jìn)行。前一個(gè)方法稱(chēng)為黑盒測(cè)試,后一個(gè)方法稱(chēng)為白盒測(cè)試。第17頁(yè)/共113頁(yè)

對(duì)于軟件測(cè)試而言,黑盒測(cè)試法把程序看成一個(gè)黑盒子,完全不考慮程序的內(nèi)部結(jié)構(gòu)和處理過(guò)程。也就是說(shuō),黑盒測(cè)試是在程序接口進(jìn)行的測(cè)試,它只檢查程序功能是否能按照規(guī)格說(shuō)明書(shū)的規(guī)定正常使用,程序是否能適當(dāng)?shù)亟邮蛰斎霐?shù)據(jù)產(chǎn)生正確的輸出信息,并且保持外部信息(如,數(shù)據(jù)庫(kù)或文件)的完整性。黑盒測(cè)試又稱(chēng)為功能測(cè)試。與黑盒測(cè)試法相反,白盒測(cè)試法的前提是可以把程序看成裝在一個(gè)透明的白盒子里,也就是完全了解程序的結(jié)構(gòu)和處理過(guò)程。這種方法按照程序內(nèi)部的邏輯測(cè)試程序,檢驗(yàn)程序中的每條通路是否都能按預(yù)定要求正確工作。白盒測(cè)試又稱(chēng)為結(jié)構(gòu)測(cè)試。第18頁(yè)/共113頁(yè)

粗看起來(lái),不論采用上述哪種測(cè)試方法,只要對(duì)每一種可能的情況都進(jìn)行測(cè)試,就可以得到完全正確的程序。包含所有可能情況的測(cè)試稱(chēng)為窮盡測(cè)試,對(duì)于實(shí)際程序而言,窮盡測(cè)試通常是不可能做到的。

因?yàn)椴豢赡苓M(jìn)行窮盡測(cè)試,所以軟件測(cè)試不可能發(fā)現(xiàn)程序中的所有錯(cuò)誤,也就是說(shuō),通過(guò)測(cè)試并不能證明程序是正確的。但是,我們的目的是要通過(guò)測(cè)試保證軟件的可靠性,因此,必須仔細(xì)設(shè)計(jì)測(cè)試方案,力爭(zhēng)用盡可能少的測(cè)試發(fā)現(xiàn)盡可能多的錯(cuò)誤。第19頁(yè)/共113頁(yè)4.2.4軟件測(cè)試準(zhǔn)則為了能夠設(shè)計(jì)出有效的測(cè)試方案,軟件工程師必須充分理解并正確運(yùn)用指導(dǎo)軟件測(cè)試工作的基本準(zhǔn)則。下面敘述主要的測(cè)試準(zhǔn)則:●所有測(cè)試都應(yīng)該能夠追溯到用戶需求。正如前面講過(guò)的,軟件測(cè)試的目標(biāo)是發(fā)現(xiàn)程序中的錯(cuò)誤。從用戶角度看,最嚴(yán)重的錯(cuò)誤是程序不能滿足用戶需求的那些錯(cuò)誤,因此應(yīng)該圍繞用戶的需求來(lái)測(cè)試程序?!駪?yīng)該在開(kāi)始測(cè)試之前預(yù)先制定出測(cè)試計(jì)劃。一旦完成了需求分析就可以著手制定測(cè)試計(jì)劃,在確定了設(shè)計(jì)模型之后就可以立即開(kāi)始設(shè)計(jì)詳細(xì)的測(cè)試方案。因此,在編碼之前就可以對(duì)所有測(cè)試工作進(jìn)行計(jì)劃和設(shè)計(jì)。第20頁(yè)/共113頁(yè)●在軟件測(cè)試過(guò)程中應(yīng)該應(yīng)用Pareto原理。Pareto原理告訴我們,測(cè)試所發(fā)現(xiàn)的錯(cuò)誤中的80%很可能是由程序中20%的模塊造成的。因此,應(yīng)該盡量找出這些可疑的模塊并徹底地測(cè)試它們?!駪?yīng)該從“小規(guī)?!睖y(cè)試開(kāi)始,逐步過(guò)渡到“大規(guī)模”測(cè)試。通常,首先測(cè)試單個(gè)程序模塊,進(jìn)一步的測(cè)試重點(diǎn)隨后轉(zhuǎn)向在集成的模塊簇中尋找錯(cuò)誤,最后對(duì)整個(gè)軟件系統(tǒng)進(jìn)行測(cè)試。第21頁(yè)/共113頁(yè)●窮舉測(cè)試是不可能的。在上一小節(jié)已經(jīng)舉例說(shuō)明了這個(gè)事實(shí),此處不再贅述。這個(gè)事實(shí)表明,測(cè)試只能證明程序中有錯(cuò)誤,不能證明程序中沒(méi)有錯(cuò)誤。但是,精心設(shè)計(jì)測(cè)試方案,有可能充分覆蓋程序邏輯并發(fā)現(xiàn)大部分程序錯(cuò)誤。●為了達(dá)到最佳的測(cè)試效果,應(yīng)該由獨(dú)立的第三方來(lái)從事測(cè)試工作。所謂“最佳測(cè)試效果”是指用盡可能少的測(cè)試方案發(fā)現(xiàn)了盡可能多的程序錯(cuò)誤。由于在4.2.2小節(jié)中已經(jīng)講過(guò)的原因,創(chuàng)建軟件系統(tǒng)的軟件工程師并不是完成全部測(cè)試工作的最佳人選(他們通常主要承擔(dān)模塊測(cè)試工作)。第22頁(yè)/共113頁(yè)4.3白盒測(cè)試技術(shù)

白盒測(cè)試方法是按照程序內(nèi)部預(yù)期應(yīng)有的邏輯測(cè)試程序,檢驗(yàn)程序中的每條執(zhí)行通路是否都能按預(yù)定要求正確工作。設(shè)計(jì)測(cè)試方案是測(cè)試階段的關(guān)鍵技術(shù)問(wèn)題。所謂測(cè)試方案包括下述三方面內(nèi)容:具體的測(cè)試目的(例如,要測(cè)試的具體功能),應(yīng)該輸入的測(cè)試數(shù)據(jù)和預(yù)期的輸出結(jié)果。通常又把測(cè)試數(shù)據(jù)和預(yù)期的輸出結(jié)果稱(chēng)為測(cè)試用例。不同的測(cè)試數(shù)據(jù)發(fā)現(xiàn)程序錯(cuò)誤的能力差別很大,為了提高測(cè)試效率降低測(cè)試成本,應(yīng)該選用高效的測(cè)試數(shù)據(jù)。因?yàn)椴豢赡苓M(jìn)行窮盡的測(cè)試,選用少量“最有效的”測(cè)試數(shù)據(jù),做到盡可能完備的測(cè)試就更重要了。返回目錄第23頁(yè)/共113頁(yè)4.3.1邏輯覆蓋邏輯覆蓋是設(shè)計(jì)白盒測(cè)試方案的一種常用技術(shù)。通常不可能進(jìn)行窮盡的測(cè)試,因此,有選擇地執(zhí)行程序中某些最有代表性的通路,是用白盒方法測(cè)試程序時(shí)對(duì)窮盡測(cè)試惟一可行的替代辦法。所謂邏輯覆蓋,是對(duì)一系列測(cè)試過(guò)程的總稱(chēng),這組測(cè)試過(guò)程逐漸進(jìn)行越來(lái)越完整的通路測(cè)試。測(cè)試數(shù)據(jù)執(zhí)行(或稱(chēng)為覆蓋)程序邏輯的程度可以劃分成哪些不同的等級(jí)呢?從覆蓋源程序語(yǔ)句的詳盡程度分析,大致有以下一些不同的覆蓋標(biāo)準(zhǔn)。第24頁(yè)/共113頁(yè)1.語(yǔ)句覆蓋為了暴露程序中的錯(cuò)誤,至少每個(gè)語(yǔ)句應(yīng)該執(zhí)行一次。語(yǔ)句覆蓋的含義是,選擇足夠多的測(cè)試數(shù)據(jù),使被測(cè)程序中每個(gè)語(yǔ)句至少執(zhí)行一次。

例如,圖4.2是一個(gè)被測(cè)模塊的流程圖,它的源程序(用PASCAL語(yǔ)言書(shū)寫(xiě))應(yīng)該如下:圖4.2

被測(cè)試模塊的流程圖

第25頁(yè)/共113頁(yè)P(yáng)ROCEDUREEXAMPLE(A,B:REAL;VARX:REAL);BEGINIF(A>1)AND(B=0)THENX:=X/A;IF(A=2)OR(X>1)THENX:=X+1END;為了使每個(gè)語(yǔ)句都執(zhí)行一次,程序的執(zhí)行路徑應(yīng)該是sacbed,為此只需要輸入下面的測(cè)試數(shù)據(jù)(實(shí)際上X可以是任意實(shí)數(shù)):A=2,B=0,X=4第26頁(yè)/共113頁(yè)2.判定覆蓋判定覆蓋又叫分支覆蓋,它的含義是,不僅每個(gè)語(yǔ)句必須至少執(zhí)行一次,而且每個(gè)判定的每種可能的結(jié)果都應(yīng)該至少執(zhí)行一次,也就是每個(gè)判定的每個(gè)分支都至少執(zhí)行一次。對(duì)于上述例子來(lái)說(shuō),能夠分別覆蓋路徑sacbed和sabd的兩組測(cè)試數(shù)據(jù),或者可以分別覆蓋路徑sacbd和sabed的兩組測(cè)試數(shù)據(jù),都滿足判定覆蓋標(biāo)準(zhǔn)。例如,用下面兩組測(cè)試數(shù)據(jù)就可做到判定覆蓋:Ⅰ.

A=3,B=0,X=3(覆蓋sacbd)Ⅱ.

A=2,B=1,X=1(覆蓋sabed)判定覆蓋比語(yǔ)句覆蓋強(qiáng),但是對(duì)程序邏輯的覆蓋程度仍然不高,例如,上面的測(cè)試數(shù)據(jù)只覆蓋了程序全部路徑的一半。第27頁(yè)/共113頁(yè)3.條件覆蓋條件覆蓋的含義是,不僅每個(gè)語(yǔ)句至少執(zhí)行一次,而且使判定表達(dá)式中的每個(gè)條件都取到各種可能的結(jié)果。圖4.2的例子中共有兩個(gè)判定表達(dá)式,每個(gè)表達(dá)式中有兩個(gè)條件,為了做到條件覆蓋,應(yīng)該選取測(cè)試數(shù)據(jù)使得在a點(diǎn)有下述各種結(jié)果出現(xiàn):A>1,A≤1,B=0,B≠0

在b點(diǎn)有下述各種結(jié)果出現(xiàn):A=2,A≠2,X>1,X≤1第28頁(yè)/共113頁(yè)只需要使用下面兩組測(cè)試數(shù)據(jù)就可以達(dá)到上述覆蓋標(biāo)準(zhǔn):Ⅰ.A=2,B=0,X=4(滿足A>1,B=0,A=2和X>1的條件,執(zhí)行路徑sacbed)Ⅱ.A=1,B=1,X=1(滿足A≤1,B≠0,A≠2和X≤1的條件,執(zhí)行路徑sabd)第29頁(yè)/共113頁(yè)

條件覆蓋通常比判定覆蓋強(qiáng),因?yàn)樗古卸ū磉_(dá)式中每個(gè)條件都取到了兩個(gè)不同的結(jié)果,判定覆蓋卻只關(guān)心整個(gè)判定表達(dá)式的值。例如,上面兩組測(cè)試數(shù)據(jù)也同時(shí)滿足判定覆蓋標(biāo)準(zhǔn)。但是,也可能有相反的情況:雖然每個(gè)條件都取到了兩個(gè)不同的結(jié)果,判定表達(dá)式卻始終只取一個(gè)值。例如,如果使用下面兩組測(cè)試數(shù)據(jù),則只滿足條件覆蓋標(biāo)準(zhǔn)并不滿足判定覆蓋標(biāo)準(zhǔn)(第二個(gè)判定表達(dá)式的值總為真):Ⅰ.A=2,B=0,X=1(滿足A>1,B=0,A=2和X≤1的條件,執(zhí)行路徑sacbed)Ⅱ.A=1,B=1,X=2(滿足A≤1,B≠0,A≠2和X>1的條件,執(zhí)行路徑sabed)第30頁(yè)/共113頁(yè)4.判定/條件覆蓋既然判定覆蓋不一定包含條件覆蓋,條件覆蓋也不一定包含判定覆蓋,自然會(huì)提出一種能同時(shí)滿足這兩種覆蓋標(biāo)準(zhǔn)的邏輯覆蓋,這就是判定/條件覆蓋。它的含義是,選取足夠多的測(cè)試數(shù)據(jù),使得判定表達(dá)式中的每個(gè)條件都取到各種可能的值,而且每個(gè)判定表達(dá)式也都取到各種可能的結(jié)果。對(duì)于圖4.2的例子而言,下述兩組測(cè)試數(shù)據(jù)滿足判定/條件覆蓋標(biāo)準(zhǔn):Ⅰ.A=2,B=0,X=4Ⅱ.A=1,B=1,X=1

但是,這兩組測(cè)試數(shù)據(jù)也就是為了滿足條件覆蓋標(biāo)準(zhǔn)最初選取的兩組數(shù)據(jù),因此,有時(shí)判定/條件覆蓋也并不比條件覆蓋更強(qiáng)。第31頁(yè)/共113頁(yè)5.條件組合覆蓋條件組合覆蓋是更強(qiáng)的邏輯覆蓋標(biāo)準(zhǔn),它要求選取足夠多的測(cè)試數(shù)據(jù),使得每個(gè)判定表達(dá)式中條件的各種可能組合都至少出現(xiàn)一次。對(duì)于圖4.2的例子,共有八種可能的條件組合,它們是:(1)A>1,B=0(2)A>1,B≠0(3)A≤1,B=0(4)A≤1,B≠0(5)A=2,X>1(6)A=2,X≤1(7)A≠2,X>1(8)A≠2,X≤1

和其他邏輯覆蓋標(biāo)準(zhǔn)中的測(cè)試數(shù)據(jù)一樣,條件組合(5)~(8)中的X值是指在程序流程圖第二個(gè)判定框(b點(diǎn))的X值。第32頁(yè)/共113頁(yè)

下面的四組測(cè)試數(shù)據(jù)可以使上面列出的八種條件組合每種至少出現(xiàn)一次:Ⅰ.A=2,B=0,X=4(針對(duì)1,5兩種組合,執(zhí)行路徑sacbed)Ⅱ.A=2,B=1,X=1(針對(duì)2,6兩種組合,執(zhí)行路徑sabed)Ⅲ.A=1,B=0,X=2(針對(duì)3,7兩種組合,執(zhí)行路徑sabed)Ⅳ.A=1,B=1,X=1(針對(duì)4,8兩種組合,執(zhí)行路徑Sabd)第33頁(yè)/共113頁(yè)

顯然,滿足條件組合覆蓋標(biāo)準(zhǔn)的測(cè)試數(shù)據(jù),也一定滿足判定覆蓋、條件覆蓋和判定/條件覆蓋標(biāo)準(zhǔn)。因此,條件組合覆蓋是前述幾種覆蓋標(biāo)準(zhǔn)中最強(qiáng)的。但是,滿足條件組合覆蓋標(biāo)準(zhǔn)的測(cè)試數(shù)據(jù)并不一定能使程序中的每條路徑都執(zhí)行到,例如,上述四組測(cè)試數(shù)據(jù)都沒(méi)有測(cè)試到路徑sacbd。第34頁(yè)/共113頁(yè)4.3.2控制結(jié)構(gòu)測(cè)試另外一類(lèi)重要的白盒測(cè)試技術(shù),是根據(jù)程序的控制結(jié)構(gòu)設(shè)計(jì)測(cè)試用例的技術(shù),本節(jié)講述其中一些常用的技術(shù)。1.流圖按照程序的控制結(jié)構(gòu)設(shè)計(jì)測(cè)試用例時(shí),往往需要仔細(xì)分析程序的控制流。為了突出表現(xiàn)程序的控制流,可以使用流圖(也稱(chēng)為程序圖)。流圖僅僅描繪程序的控制流程,它完全不表現(xiàn)對(duì)數(shù)據(jù)的具體操作以及分支或循環(huán)的具體條件。第35頁(yè)/共113頁(yè)

在流圖中用圓表示節(jié)點(diǎn),一個(gè)圓代表一條或多條語(yǔ)句。程序流程圖中一個(gè)順序執(zhí)行的處理框序列和一個(gè)菱形判定框,可以映射成流圖中的一個(gè)節(jié)點(diǎn)。流圖中的箭頭線稱(chēng)為邊,它和程序流程圖中的箭頭線類(lèi)似,代表控制流。在流圖中一條邊必須終止于一個(gè)節(jié)點(diǎn),即使這個(gè)節(jié)點(diǎn)并不代表任何語(yǔ)句(實(shí)際上相當(dāng)于一個(gè)空語(yǔ)句)。由邊和節(jié)點(diǎn)圍成的面積稱(chēng)為區(qū)域,當(dāng)計(jì)算區(qū)域數(shù)時(shí)應(yīng)該包括圖外部未被圍起來(lái)的那個(gè)區(qū)域。第36頁(yè)/共113頁(yè)圖4.3舉例說(shuō)明把程序流程圖映射成流圖的方法。

圖4.3把程序流程圖映射成流圖(a)程序流程圖;(b)流圖第37頁(yè)/共113頁(yè)

事實(shí)上,用任何方式表示的過(guò)程設(shè)計(jì)結(jié)果,都可以翻譯成流圖。下面講述基本路徑測(cè)試方法時(shí),將把用PDL描述的一個(gè)處理過(guò)程轉(zhuǎn)換成流圖。當(dāng)過(guò)程設(shè)計(jì)結(jié)果中包含復(fù)合條件時(shí),翻譯成流圖的方法稍微復(fù)雜一些。所謂復(fù)合條件,就是在判定條件中包含了一個(gè)或多個(gè)布爾運(yùn)算符(邏輯OR,AND,NAND,NOR)。在這種情況下,應(yīng)該把復(fù)合條件分解為若干個(gè)簡(jiǎn)單條件,每個(gè)簡(jiǎn)單條件對(duì)應(yīng)流圖中的一個(gè)節(jié)點(diǎn)。通常把包含條件的節(jié)點(diǎn)稱(chēng)為判定節(jié)點(diǎn),從每個(gè)判定節(jié)點(diǎn)引出兩條或多條邊。第38頁(yè)/共113頁(yè)

圖4.4是由包含復(fù)合條件的PDL片斷翻譯成的流圖,注意,與復(fù)合條件“aORb”對(duì)應(yīng)的節(jié)點(diǎn)有兩個(gè),這兩個(gè)節(jié)點(diǎn)分別標(biāo)記為“a”和“b”。圖4.4

由包含復(fù)合條件的PDL映射成的流圖

第39頁(yè)/共113頁(yè)

基本路徑測(cè)試是一種常用的白盒測(cè)試技術(shù)。使用這種技術(shù)設(shè)計(jì)測(cè)試用例時(shí),首先計(jì)算被測(cè)過(guò)程的邏輯復(fù)雜度,并依據(jù)算出的復(fù)雜度定義執(zhí)行路徑的基本集合,從該基本集合導(dǎo)出的測(cè)試用例可以保證程序中的每條語(yǔ)句至少被執(zhí)行一次,而且每個(gè)判定條件在執(zhí)行時(shí)都分別取true(真)和false(假)兩個(gè)值。使用基本路徑測(cè)試技術(shù)設(shè)計(jì)測(cè)試用例的步驟如下:第1步依據(jù)過(guò)程設(shè)計(jì)的結(jié)果畫(huà)出相應(yīng)的流圖。

2.基本路徑測(cè)試第40頁(yè)/共113頁(yè)

例如,為了測(cè)試下列的用PDL描述的求平均值的過(guò)程,首先畫(huà)出圖4.5所示的流圖。注意,為了正確地畫(huà)出流圖,我們把被映射為流圖節(jié)點(diǎn)的PDL語(yǔ)句編了號(hào)。圖4.5

求平均值過(guò)程的流圖第41頁(yè)/共113頁(yè)第2步計(jì)算流圖的環(huán)形復(fù)雜度。環(huán)形復(fù)雜度定量度量程序邏輯的復(fù)雜程度。畫(huà)出描繪程序控制流的流圖之后,可以使用下述三種方法中的任一種來(lái)計(jì)算環(huán)形復(fù)雜度。(1)流圖中的區(qū)域數(shù)等于環(huán)形復(fù)雜度。(2)流圖G的環(huán)形復(fù)雜度V(G)由下式計(jì)算:V(G)=E-N+2

其中,E是流圖中邊的條數(shù),N是流圖中節(jié)點(diǎn)數(shù)。(3)流圖G的環(huán)形復(fù)雜度V(G)也可由下式計(jì)算:V(G)=P+1

其中,P是流圖中判定節(jié)點(diǎn)的數(shù)目。例如,使用上述任何一種方法,都可以計(jì)算出圖4.5所示流圖的環(huán)形復(fù)雜度為6。第42頁(yè)/共113頁(yè)第3步確定線性獨(dú)立路徑的基本集合。所謂線性獨(dú)立路徑是指這樣的路徑,該路徑至少引入了程序的一個(gè)新處理語(yǔ)句集合或一個(gè)新條件,用流圖術(shù)語(yǔ)描述,獨(dú)立路徑中至少包含一條在定義該路徑之前不曾用過(guò)的邊。使用基本路徑測(cè)試法設(shè)計(jì)測(cè)試用例時(shí),程序的環(huán)形復(fù)雜度決定了程序中獨(dú)立路徑的數(shù)量,而且這個(gè)數(shù)是確保程序中所有語(yǔ)句至少被執(zhí)行一次所需要的測(cè)試數(shù)量的上限。第43頁(yè)/共113頁(yè)

第4步設(shè)計(jì)出可強(qiáng)制執(zhí)行基本集合中每條路徑的測(cè)試用例。應(yīng)該選取測(cè)試數(shù)據(jù),使得在測(cè)試每條路徑時(shí)都適當(dāng)?shù)卦O(shè)置好了各個(gè)判定節(jié)點(diǎn)的條件。在測(cè)試過(guò)程中,執(zhí)行每個(gè)測(cè)試用例并把程序?qū)嶋H輸出的結(jié)果與預(yù)期結(jié)果相比較。一旦執(zhí)行完全部測(cè)試用例,就可以確保程序中所有語(yǔ)句都至少被執(zhí)行了一次,而且每個(gè)判定條件都分別取過(guò)true值和false值。應(yīng)該注意,某些獨(dú)立路徑(例如,本例中的路徑1和路徑3)不能以獨(dú)立的方式測(cè)試,也就是說(shuō),程序的正常流程不能形成獨(dú)立執(zhí)行該路徑所需要的數(shù)據(jù)組合(例如,為了執(zhí)行本例中的路徑1,需要滿足條件total.valid>0,然而獨(dú)立執(zhí)行路徑1無(wú)法滿足這個(gè)條件)。在這種情況下,這些路徑必須作為另一個(gè)路徑的一部分來(lái)測(cè)試。第44頁(yè)/共113頁(yè)3.條件測(cè)試盡管基本路徑測(cè)試技術(shù)簡(jiǎn)單而且高效,但是僅有這種技術(shù)仍然不夠,還需要同時(shí)使用其他控制結(jié)構(gòu)測(cè)試技術(shù),才能進(jìn)一步提高白盒測(cè)試的質(zhì)量。用條件測(cè)試技術(shù)設(shè)計(jì)出的測(cè)試用例,能夠檢查程序模塊中包含的邏輯條件。一個(gè)簡(jiǎn)單條件是一個(gè)布爾變量或一個(gè)關(guān)系表達(dá)式,在布爾變量或關(guān)系表達(dá)式之前還可能有一個(gè)NOT(“┐”)算符。關(guān)系表達(dá)式的形式如下:E1<關(guān)系算符>E2

其中,E1和E2是算術(shù)表達(dá)式,而<關(guān)系算符>是下列算符之一:“<”,“≤”,“=”,“≠”,“>”或“≥”。復(fù)合條件由兩個(gè)或多個(gè)簡(jiǎn)單條件、布爾算符和括弧組成。布爾算符有OR(“|”),AND(“&”)和NOT(“┐”)。不包含關(guān)系表達(dá)式的條件稱(chēng)為布爾表達(dá)式。第45頁(yè)/共113頁(yè)

因此,一個(gè)條件中可能包含布爾變量、布爾算符、布爾括弧(括住簡(jiǎn)單條件或復(fù)合條件)、關(guān)系算符及算術(shù)表達(dá)式等成分。如果條件不正確,則至少組成該條件的一個(gè)成分不正確。因此,條件錯(cuò)誤的類(lèi)型如下:●布爾變量錯(cuò)?!癫紶査惴e(cuò)(布爾算符不正確,遺漏布爾算符或有多余的布爾算符)?!癫紶柪ɑ″e(cuò)?!耜P(guān)系算符錯(cuò)?!袼阈g(shù)表達(dá)式錯(cuò)。

第46頁(yè)/共113頁(yè)

條件測(cè)試方法著重測(cè)試程序中的每個(gè)條件,這種測(cè)試方法有下述兩個(gè)優(yōu)點(diǎn):(1)容易度量條件的測(cè)試覆蓋率;(2)程序中條件的測(cè)試覆蓋率可以指導(dǎo)附加測(cè)試的設(shè)計(jì)。條件測(cè)試的目的,不僅僅是檢測(cè)程序條件中的錯(cuò)誤,而且也檢測(cè)程序中其他類(lèi)型的錯(cuò)誤。如果程序P的測(cè)試集能有效地檢測(cè)P中條件的錯(cuò)誤,則它很可能也可以有效地檢測(cè)P中的其他錯(cuò)誤。此外,如果一個(gè)測(cè)試策略對(duì)檢測(cè)條件錯(cuò)誤是有效的,則該策略很可能對(duì)檢測(cè)程序的其他錯(cuò)誤也是有效的。

第47頁(yè)/共113頁(yè)

軟件工程師們已經(jīng)提出了許多條件測(cè)試策略。分支測(cè)試可能是最簡(jiǎn)單的條件測(cè)試策略。對(duì)于復(fù)合條件C來(lái)說(shuō),C的真分支和假分支以及C中的每個(gè)簡(jiǎn)單條件,都應(yīng)該至少執(zhí)行一次。域測(cè)試要求對(duì)一個(gè)關(guān)系表達(dá)式執(zhí)行三個(gè)或四個(gè)測(cè)試。對(duì)于形式為E1<關(guān)系算符>E2的關(guān)系表達(dá)式來(lái)說(shuō),需要三個(gè)測(cè)試分別使E1的值大于、等于或小于E2的值。如果<關(guān)系算符>錯(cuò)誤而E1和E2正確,則這三個(gè)測(cè)試能夠發(fā)現(xiàn)關(guān)系算符的錯(cuò)誤。為了發(fā)現(xiàn)E1和E2中的錯(cuò)誤,讓E1值大于(或小于)E2值的測(cè)試數(shù)據(jù)應(yīng)該使這兩個(gè)值之間的差別盡可能小。第48頁(yè)/共113頁(yè)

在上述種種條件測(cè)試技術(shù)的基礎(chǔ)上,K.C.Tai提出了一種被稱(chēng)為BRO(BranchandRelationalOperator)測(cè)試的條件測(cè)試策略。如果在條件中所有布爾變量和關(guān)系算符都只出現(xiàn)一次而且沒(méi)有公共變量,則BRO測(cè)試保證能發(fā)現(xiàn)該條件中的分支錯(cuò)和關(guān)系算符錯(cuò)。

BRO測(cè)試?yán)脳l件C的條件約束來(lái)設(shè)計(jì)測(cè)試用例。包含n個(gè)簡(jiǎn)單條件的條件C的條件約束定義為(D1,D2,…,Dn)其中Di(0<i≤n)表示條件C中第i個(gè)簡(jiǎn)單條件的輸出約束。如果在條件C的一次執(zhí)行過(guò)程中,C中每個(gè)簡(jiǎn)單條件的輸出都滿足D中對(duì)應(yīng)的約束,則稱(chēng)C的這次執(zhí)行覆蓋了C的條件約束D。對(duì)于布爾變量B來(lái)說(shuō),B的輸出約束指出,B必須是真(t)或假(f)。類(lèi)似地,對(duì)于關(guān)系表達(dá)式來(lái)說(shuō),用符號(hào)>,=和<指定表達(dá)式的輸出約束。第49頁(yè)/共113頁(yè)4.循環(huán)測(cè)試循環(huán)是絕大多數(shù)軟件算法的基礎(chǔ),但是,在測(cè)試軟件時(shí)卻往往未對(duì)循環(huán)結(jié)構(gòu)進(jìn)行足夠的測(cè)試。循環(huán)測(cè)試是一種白盒測(cè)試技術(shù),它專(zhuān)注于測(cè)試循環(huán)結(jié)構(gòu)的有效性。圖4.6

三種循環(huán)

在結(jié)構(gòu)化的程序中通常只有三種循環(huán),分別是簡(jiǎn)單循環(huán)、串接循環(huán)和嵌套循環(huán),如圖4.6所示。第50頁(yè)/共113頁(yè)

下面分別討論不同類(lèi)型循環(huán)的測(cè)試方法。(1)簡(jiǎn)單循環(huán)應(yīng)該使用下列測(cè)試集來(lái)測(cè)試簡(jiǎn)單循環(huán),其中n是允許通過(guò)循環(huán)的最大次數(shù)。●跳過(guò)循環(huán)。●只通過(guò)循環(huán)一次?!裢ㄟ^(guò)循環(huán)兩次。●通過(guò)循環(huán)m次,其中m<n-1?!裢ㄟ^(guò)循環(huán)n-1,n,n+1次。第51頁(yè)/共113頁(yè)(2)嵌套循環(huán)如果把簡(jiǎn)單循環(huán)的測(cè)試方法直接應(yīng)用到嵌套循環(huán),可能的測(cè)試數(shù)就會(huì)隨嵌套層數(shù)的增加按幾何級(jí)數(shù)增長(zhǎng),這會(huì)導(dǎo)致不切實(shí)際的測(cè)試數(shù)目。B.Beizer提出了一種能減少測(cè)試數(shù)的方法?!駨淖顑?nèi)層循環(huán)開(kāi)始測(cè)試,把所有其他循環(huán)都設(shè)置為最小值?!駥?duì)最內(nèi)層循環(huán)使用簡(jiǎn)單循環(huán)測(cè)試方法,而使外層循環(huán)的迭代參數(shù)(例如,循環(huán)計(jì)數(shù)器)取最小值,并為越界值或非法值增加一些額外的測(cè)試?!裼蓛?nèi)向外,對(duì)下一個(gè)循環(huán)進(jìn)行測(cè)試,但保持所有其他外層循環(huán)為最小值,其他嵌套循環(huán)為“典型”值。●繼續(xù)進(jìn)行下去,直到測(cè)試完所有循環(huán)。第52頁(yè)/共113頁(yè)(3)串接循環(huán)如果串接循環(huán)的各個(gè)循環(huán)都彼此獨(dú)立,則可以使用前述的測(cè)試簡(jiǎn)單循環(huán)的方法來(lái)測(cè)試串接循環(huán)。但是,如果兩個(gè)循環(huán)串接,而且第一個(gè)循環(huán)的循環(huán)計(jì)數(shù)器值是第二個(gè)循環(huán)的初始值,則這兩個(gè)循環(huán)并不是獨(dú)立的。當(dāng)循環(huán)不獨(dú)立時(shí),建議使用測(cè)試嵌套循環(huán)的方法來(lái)測(cè)試串接循環(huán)。第53頁(yè)/共113頁(yè)4.4黑盒測(cè)試技術(shù)

黑盒測(cè)試著重檢驗(yàn)程序的功能是否滿足對(duì)它的需求,也就是說(shuō),黑盒測(cè)試讓軟件工程師設(shè)計(jì)出能充分檢查程序所有功能需求的輸入條件集。黑盒測(cè)試技術(shù)并不能取代白盒測(cè)試技術(shù),它是與白盒測(cè)試技術(shù)互補(bǔ)的方法。黑盒測(cè)試很可能發(fā)現(xiàn)白盒測(cè)試不易發(fā)現(xiàn)的其他不同類(lèi)型的錯(cuò)誤。確切地說(shuō),黑盒測(cè)試力圖發(fā)現(xiàn)下述類(lèi)型的錯(cuò)誤:●程序功能不正確或遺漏了用戶需要的功能;●界面錯(cuò)誤;●數(shù)據(jù)結(jié)構(gòu)錯(cuò)誤或外部數(shù)據(jù)庫(kù)訪問(wèn)錯(cuò)誤;●性能達(dá)不到要求;●初始化和終止錯(cuò)誤。通常,白盒測(cè)試在測(cè)試過(guò)程的早期階段進(jìn)行,而黑盒測(cè)試則主要用在測(cè)試過(guò)程的后期。黑盒測(cè)試故意不考慮程序的控制結(jié)構(gòu),而把注意力集中于信息域。返回目錄第54頁(yè)/共113頁(yè)設(shè)計(jì)黑盒測(cè)試用例時(shí)應(yīng)該仔細(xì)考慮下述問(wèn)題:●怎樣測(cè)試程序功能的有效性?●哪些類(lèi)型的輸入可構(gòu)成高效的測(cè)試用例?●程序是否對(duì)特定的輸入值特別敏感?●怎樣劃定數(shù)據(jù)類(lèi)的邊界?●系統(tǒng)能夠承受什么樣的數(shù)據(jù)率和數(shù)據(jù)量?●數(shù)據(jù)的特定組合將對(duì)系統(tǒng)運(yùn)行產(chǎn)生什么影響?

第55頁(yè)/共113頁(yè)

應(yīng)用黑盒測(cè)試技術(shù)可以設(shè)計(jì)出滿足下述標(biāo)準(zhǔn)的測(cè)試用例集:1.所設(shè)計(jì)出的測(cè)試用例能夠減少為達(dá)到合理測(cè)試而需要設(shè)計(jì)的附加測(cè)試用例的數(shù)目;2.所設(shè)計(jì)出的測(cè)試用例能夠告訴我們,是否存在某些類(lèi)型的錯(cuò)誤,而不是僅僅指出與特定測(cè)試相關(guān)的錯(cuò)誤是否存在。第56頁(yè)/共113頁(yè)4.4.1等價(jià)劃分等價(jià)劃分是一種黑盒測(cè)試技術(shù),這種方法首先把程序的輸入域劃分成若干個(gè)數(shù)據(jù)類(lèi),然后根據(jù)劃分出的輸入數(shù)據(jù)種類(lèi)設(shè)計(jì)測(cè)試用例。一個(gè)理想的測(cè)試用例能夠獨(dú)自發(fā)現(xiàn)一類(lèi)錯(cuò)誤(例如,對(duì)所有字符數(shù)據(jù)的處理都不正確)。以前曾經(jīng)講過(guò),窮盡的黑盒測(cè)試(即使用所有有效的和無(wú)效的輸入數(shù)據(jù)測(cè)試程序)通常是不現(xiàn)實(shí)的。因此,只能選取少量最有代表性的輸入數(shù)據(jù)作為測(cè)試數(shù)據(jù),以便用較小的代價(jià)測(cè)試出較多的程序錯(cuò)誤。第57頁(yè)/共113頁(yè)

什么樣的輸入數(shù)據(jù)是最有代表性的呢?如果把所有可能的輸入數(shù)據(jù)(既包括有效的輸入數(shù)據(jù)也包括無(wú)效的輸入數(shù)據(jù))劃分成若干個(gè)等價(jià)類(lèi),則可以合理地做出下述假定:每類(lèi)數(shù)據(jù)中的一個(gè)典型值在測(cè)試中的作用與這一類(lèi)中所有其他值的作用相同。因此,可以從每個(gè)等價(jià)類(lèi)中只取一組數(shù)值作為測(cè)試數(shù)據(jù)。這樣選取的測(cè)試數(shù)據(jù)最有代表性,最可能發(fā)現(xiàn)程序中的錯(cuò)誤。事實(shí)上,等價(jià)劃分法力圖設(shè)計(jì)出一個(gè)能發(fā)現(xiàn)若干類(lèi)錯(cuò)誤的測(cè)試用例,從而減少必須設(shè)計(jì)的測(cè)試用例的數(shù)目。第58頁(yè)/共113頁(yè)

使用等價(jià)劃分法設(shè)計(jì)測(cè)試方案首先需要?jiǎng)澐州斎霐?shù)據(jù)的等價(jià)類(lèi),為此需要研究程序的功能說(shuō)明,從而確定輸入數(shù)據(jù)的有效等價(jià)類(lèi)和無(wú)效等價(jià)類(lèi)。在確定輸入數(shù)據(jù)的等價(jià)類(lèi)時(shí)常常還需要分析輸出數(shù)據(jù)的等價(jià)類(lèi),以便根據(jù)輸出數(shù)據(jù)的等價(jià)類(lèi)導(dǎo)出對(duì)應(yīng)的輸入數(shù)據(jù)等價(jià)類(lèi)。第59頁(yè)/共113頁(yè)

劃分等價(jià)類(lèi)需要經(jīng)驗(yàn),下述幾條啟發(fā)式規(guī)則可能有助于等價(jià)類(lèi)的劃分:●如果規(guī)定了輸入值的范圍,則可劃分出一個(gè)有效的等價(jià)類(lèi)(輸入值在此范圍內(nèi)),兩個(gè)無(wú)效的等價(jià)類(lèi)(輸入值小于最小值或大于最大值);●如果規(guī)定了輸入數(shù)據(jù)的個(gè)數(shù),則類(lèi)似地也可以劃分出一個(gè)有效的等價(jià)類(lèi)和兩個(gè)無(wú)效的等價(jià)類(lèi);●如果規(guī)定了輸入數(shù)據(jù)的一組值,而且程序?qū)Σ煌斎胫底霾煌幚?,則每個(gè)允許的輸入值是一個(gè)有效的等價(jià)類(lèi),此外還有一個(gè)無(wú)效的等價(jià)類(lèi)(任一個(gè)不允許的輸入值);●如果規(guī)定了輸入數(shù)據(jù)必須遵循的規(guī)則,則可以劃分出一個(gè)有效的等價(jià)類(lèi)(符合規(guī)則)和若干個(gè)無(wú)效的等價(jià)類(lèi)(從各種不同角度違反規(guī)則);●如果規(guī)定了輸入數(shù)據(jù)為整型,則可以劃分出正整數(shù)、零和負(fù)整數(shù)等三個(gè)有效類(lèi);●如果程序的處理對(duì)象是表格,則應(yīng)該使用空表,以及含一項(xiàng)或多項(xiàng)的表。第60頁(yè)/共113頁(yè)

以上列出的啟發(fā)式規(guī)則只是測(cè)試時(shí)可能遇到的情況中的很小一部分,實(shí)際情況千變?nèi)f化,根本無(wú)法一一列出。為了正確劃分等價(jià)類(lèi),一是要注意積累經(jīng)驗(yàn),二是要正確分析被測(cè)程序的功能。此外,在劃分無(wú)效的等價(jià)類(lèi)時(shí)還必須考慮編譯程序的檢錯(cuò)功能,一般說(shuō)來(lái),不需要設(shè)計(jì)測(cè)試數(shù)據(jù)用來(lái)暴露編譯程序肯定能發(fā)現(xiàn)的錯(cuò)誤。最后說(shuō)明一點(diǎn),上面列出的啟發(fā)式規(guī)則雖然都是針對(duì)輸入數(shù)據(jù)說(shuō)的,但是其中絕大部分也同樣適用于輸出數(shù)據(jù)。第61頁(yè)/共113頁(yè)

劃分出等價(jià)類(lèi)以后,根據(jù)等價(jià)類(lèi)設(shè)計(jì)測(cè)試方案時(shí)主要使用下面兩個(gè)步驟:(1)設(shè)計(jì)一個(gè)新的測(cè)試方案以盡可能多地覆蓋尚未被覆蓋的有效等價(jià)類(lèi),復(fù)重這一步驟直到所有有效等價(jià)類(lèi)都被覆蓋為止;(2)設(shè)計(jì)一個(gè)新的測(cè)試方案,使它覆蓋一個(gè)而且只覆蓋一個(gè)尚未被覆蓋的無(wú)效等價(jià)類(lèi),重復(fù)這一步驟直到所有無(wú)效等價(jià)類(lèi)都被覆蓋為止。注意,通常程序發(fā)現(xiàn)一類(lèi)錯(cuò)誤后就不再檢查是否還有其他錯(cuò)誤,因此,應(yīng)該使每個(gè)測(cè)試方案只覆蓋一個(gè)無(wú)效的等價(jià)類(lèi)。第62頁(yè)/共113頁(yè)4.4.2邊界值分析經(jīng)驗(yàn)表明,處理邊界情況時(shí)程序最容易發(fā)生錯(cuò)誤。例如,許多程序錯(cuò)誤出現(xiàn)在下標(biāo)、純量、數(shù)據(jù)結(jié)構(gòu)和循環(huán)等等的邊界附近。因此,設(shè)計(jì)使程序運(yùn)行在邊界情況附近的測(cè)試方案,暴露出程序錯(cuò)誤的可能性更大一些。使用邊界值分析方法設(shè)計(jì)測(cè)試方案首先應(yīng)該確定邊界情況,這需要經(jīng)驗(yàn)和創(chuàng)造性,通常輸入等價(jià)類(lèi)和輸出等價(jià)類(lèi)的邊界,就是應(yīng)該著重測(cè)試的程序邊界情況。選取的測(cè)試數(shù)據(jù)應(yīng)該剛好等于、剛剛小于和剛剛大于邊界值。也就是說(shuō),按照邊界值分析法,應(yīng)該選取剛好等于、稍小于和稍大于等價(jià)類(lèi)邊界值的數(shù)據(jù)作為測(cè)試數(shù)據(jù),而不是選取每個(gè)等價(jià)類(lèi)內(nèi)的典型值或任意值作為測(cè)試數(shù)據(jù)。通常設(shè)計(jì)測(cè)試方案時(shí)總是聯(lián)合使用等價(jià)劃分和邊界值分析兩種技術(shù)。第63頁(yè)/共113頁(yè)4.4.3錯(cuò)誤推測(cè)錯(cuò)誤推測(cè)法在很大程度上依靠測(cè)試人員的直覺(jué)和經(jīng)驗(yàn)進(jìn)行。它的基本做法是,列舉出程序中可能有的錯(cuò)誤和容易發(fā)生錯(cuò)誤的特殊情況,并且根據(jù)它們?cè)O(shè)計(jì)測(cè)試方案。對(duì)于程序中容易出錯(cuò)的情況已有一些經(jīng)驗(yàn)總結(jié)出來(lái),例如,輸入數(shù)據(jù)值為零或輸出數(shù)據(jù)值為零往往容易發(fā)生錯(cuò)誤;如果輸入或輸出的數(shù)目允許變化(例如,被檢索的或程序生成的表的項(xiàng)數(shù)),則輸入或輸出的數(shù)目為0和1的情況(例如,表為空或只有一項(xiàng))是容易出錯(cuò)的情況。還應(yīng)該仔細(xì)分析程序規(guī)格說(shuō)明書(shū),注意找出其中的遺漏或省略的部分,以便設(shè)計(jì)相應(yīng)的測(cè)試方案,檢測(cè)程序員對(duì)這些部分的處理是否正確。

第64頁(yè)/共113頁(yè)

此外,經(jīng)驗(yàn)還告訴我們,在一段程序中已經(jīng)發(fā)現(xiàn)的錯(cuò)誤數(shù)目往往和尚未發(fā)現(xiàn)的錯(cuò)誤數(shù)成正比。例如,在IBMOS/370操作系統(tǒng)中,用戶發(fā)現(xiàn)的全部錯(cuò)誤的47%只與該系統(tǒng)4%的模塊有關(guān)。這個(gè)事實(shí)再次證實(shí)了本章4.2.4小節(jié)提到的Pareto原理。因此,在進(jìn)一步測(cè)試時(shí)應(yīng)該著重測(cè)試那些已經(jīng)發(fā)現(xiàn)了有較多錯(cuò)誤的程序段。第65頁(yè)/共113頁(yè)4.5測(cè)試策略

軟件測(cè)試策略把設(shè)計(jì)測(cè)試用例的方法集成到一系列經(jīng)過(guò)周密計(jì)劃的測(cè)試步驟中去,從而大大提高軟件測(cè)試的效果,使得軟件開(kāi)發(fā)獲得成功。任何測(cè)試策略都必須與測(cè)試計(jì)劃、測(cè)試用例設(shè)計(jì)、測(cè)試執(zhí)行以及測(cè)試結(jié)果數(shù)據(jù)的收集與分析緊密地結(jié)合在一起。4.5.1測(cè)試步驟除非是測(cè)試一個(gè)小程序,否則一開(kāi)始就把整個(gè)系統(tǒng)作為一個(gè)單獨(dú)的實(shí)體來(lái)測(cè)試是不現(xiàn)實(shí)的。與開(kāi)發(fā)過(guò)程類(lèi)似,測(cè)試過(guò)程也必須分步驟進(jìn)行,后一個(gè)步驟在邏輯上是前一個(gè)步驟的繼續(xù)。返回目錄第66頁(yè)/共113頁(yè)

從過(guò)程的觀點(diǎn)考慮測(cè)試,在軟件工程環(huán)境中的測(cè)試過(guò)程,實(shí)際上是順序進(jìn)行的四個(gè)步驟的序列。最開(kāi)始,著重測(cè)試每個(gè)單獨(dú)的模塊,以確保它作為一個(gè)單元來(lái)說(shuō)功能是正確的。因此,這種測(cè)試稱(chēng)為單元測(cè)試。單元測(cè)試大量使用白盒測(cè)試技術(shù),檢查模塊控制結(jié)構(gòu)中的特定路徑,以確保做到完全覆蓋并發(fā)現(xiàn)最大數(shù)量的錯(cuò)誤。接下來(lái),必須把模塊裝配(即集成)在一起形成完整的軟件包。在裝配的同時(shí)進(jìn)行測(cè)試,因此稱(chēng)為集成測(cè)試。集成測(cè)試同時(shí)解決程序驗(yàn)證和程序構(gòu)造這兩個(gè)問(wèn)題。在集成過(guò)程中最常用的是黑盒測(cè)試用例設(shè)計(jì)技術(shù),當(dāng)然,為了保證覆蓋主要的控制路徑,也可能使用一定數(shù)量的白盒測(cè)試。在軟件集成完成之后,還需要進(jìn)行一系列高級(jí)測(cè)試。必須測(cè)試在需求分析階段確定下來(lái)的確認(rèn)標(biāo)準(zhǔn),確認(rèn)測(cè)試是對(duì)軟件滿足所有功能的、行為的和性能的需求的最終保證。在確認(rèn)測(cè)試過(guò)程中僅使用黑盒測(cè)試技術(shù)。第67頁(yè)/共113頁(yè)4.5.2單元測(cè)試通常,單元測(cè)試和編碼屬于軟件工程過(guò)程的同一個(gè)階段。在編寫(xiě)出源程序代碼并通過(guò)了編譯程序的語(yǔ)法檢查之后,可以應(yīng)用人工測(cè)試和計(jì)算機(jī)測(cè)試這樣兩種類(lèi)型的測(cè)試,完成單元測(cè)試工作。這兩種類(lèi)型的測(cè)試各有所長(zhǎng),互相補(bǔ)充。下面講述和單元測(cè)試有關(guān)的問(wèn)題。1.單元測(cè)試的重點(diǎn)在單元測(cè)試期間應(yīng)該著重從下述五個(gè)方面對(duì)模塊進(jìn)行測(cè)試:模塊接口,局部數(shù)據(jù)結(jié)構(gòu),重要的執(zhí)行通路,出錯(cuò)處理通路,影響上述各方面特性的邊界條件。第68頁(yè)/共113頁(yè)

(1)模塊接口(2)局部數(shù)據(jù)結(jié)構(gòu)

(3)重要的執(zhí)行通路(4)出錯(cuò)處理通路(5)邊界條件第69頁(yè)/共113頁(yè)2.代碼審查人工測(cè)試源程序可以由編寫(xiě)者本人非正式地進(jìn)行,也可以由審查小組正式進(jìn)行。后者稱(chēng)為代碼審查,它是一種非常有效的程序驗(yàn)證技術(shù),對(duì)于典型的程序來(lái)說(shuō),可以查出30%~70%的邏輯設(shè)計(jì)錯(cuò)誤和編碼錯(cuò)誤。審查小組最好由下述四人組成:●組長(zhǎng),他應(yīng)該是一個(gè)很有能力的程序員,而且沒(méi)有直接參與這項(xiàng)工程;●程序的設(shè)計(jì)者;●程序的編寫(xiě)者;●程序的測(cè)試者。如果一個(gè)人既是程序的設(shè)計(jì)者又是編寫(xiě)者,或既是編寫(xiě)者又是測(cè)試者,則審查小組中應(yīng)該再增加一個(gè)程序員。第70頁(yè)/共113頁(yè)

審查之前,小組成員應(yīng)該先研究設(shè)計(jì)說(shuō)明書(shū),力求理解這個(gè)設(shè)計(jì)。為了幫助理解,可以先由設(shè)計(jì)者扼要地介紹他的設(shè)計(jì)。在審查會(huì)上由程序的編寫(xiě)者解釋他是怎樣用程序代碼實(shí)現(xiàn)這個(gè)設(shè)計(jì)的,通常是逐個(gè)語(yǔ)句地講述程序的邏輯,小組其他成員仔細(xì)傾聽(tīng)他的講解,并力圖發(fā)現(xiàn)其中的錯(cuò)誤。當(dāng)發(fā)現(xiàn)錯(cuò)誤時(shí)由組長(zhǎng)記錄下來(lái),審查會(huì)繼續(xù)進(jìn)行(審查小組的任務(wù)是發(fā)現(xiàn)錯(cuò)誤而不是改正錯(cuò)誤)。審查會(huì)還有另外一種常見(jiàn)的進(jìn)行方法(稱(chēng)為預(yù)排):由一個(gè)人扮演“測(cè)試者”,其他人扮演“計(jì)算機(jī)”。會(huì)前測(cè)試者準(zhǔn)備好測(cè)試方案,會(huì)上由扮演計(jì)算機(jī)的成員模擬計(jì)算機(jī)執(zhí)行被測(cè)試的程序。當(dāng)然,由于人執(zhí)行程序速度極慢,因此測(cè)試數(shù)據(jù)必須簡(jiǎn)單,測(cè)試方案的數(shù)目也不能過(guò)多。但是,測(cè)試方案本身并不十分關(guān)鍵,它只起一種促進(jìn)思考引起討論的作用。在大多數(shù)情況下,通過(guò)向程序員提出關(guān)于他的程序的邏輯和他編寫(xiě)程序時(shí)所做的假設(shè)的疑問(wèn),可以發(fā)現(xiàn)的錯(cuò)誤比由測(cè)試方案直接發(fā)現(xiàn)的錯(cuò)誤還多。第71頁(yè)/共113頁(yè)

代碼審查比計(jì)算機(jī)測(cè)試優(yōu)越的是:一次審查會(huì)上可以發(fā)現(xiàn)許多錯(cuò)誤;用計(jì)算機(jī)測(cè)試的方法發(fā)現(xiàn)錯(cuò)誤之后,通常需要先改正這個(gè)錯(cuò)誤才能繼續(xù)測(cè)試,因此錯(cuò)誤是一個(gè)一個(gè)地發(fā)現(xiàn)并改正的。也就是說(shuō),采用代碼審查的方法可以減少系統(tǒng)驗(yàn)證的總工作量。實(shí)踐表明,對(duì)于查找某些類(lèi)型的錯(cuò)誤來(lái)說(shuō),人工測(cè)試比計(jì)算機(jī)測(cè)試更有效;對(duì)于其他類(lèi)型的錯(cuò)誤來(lái)說(shuō)則剛好相反。因此,人工測(cè)試和計(jì)算機(jī)測(cè)試是互相補(bǔ)充,相輔相成的,缺少其中任何一種方法都會(huì)使查找錯(cuò)誤的效率降低。第72頁(yè)/共113頁(yè)3.驅(qū)動(dòng)程序和存根程序模塊并不是一個(gè)獨(dú)立的程序,因此必須為每個(gè)單元測(cè)試開(kāi)發(fā)驅(qū)動(dòng)軟件和(或)存根軟件。通常驅(qū)動(dòng)程序也就是一個(gè)“主程序”,它接收測(cè)試數(shù)據(jù),把這些數(shù)據(jù)傳送給被測(cè)試的模塊,并且印出有關(guān)的結(jié)果。存根程序代替被測(cè)試的模塊所調(diào)用的模塊。因此存根程序也可以稱(chēng)為“虛擬子程序”。它使用被它代替的模塊的接口,可能做最少量的數(shù)據(jù)操作,印出對(duì)入口的檢驗(yàn)或操作結(jié)果,并且把控制歸還給調(diào)用它的模塊。第73頁(yè)/共113頁(yè)圖4.7

正文加工系統(tǒng)的層次圖

例如,圖4.7是一個(gè)正文加工系統(tǒng)的部分層次圖,假定要測(cè)試其中編號(hào)為3.0的關(guān)鍵模塊——正文編輯模塊。第74頁(yè)/共113頁(yè)

因?yàn)檎木庉嬆K不是一個(gè)獨(dú)立的程序,所以需要有一個(gè)測(cè)試驅(qū)動(dòng)程序來(lái)調(diào)用它。這個(gè)驅(qū)動(dòng)程序說(shuō)明必要的變量,接收測(cè)試數(shù)據(jù)——字符串,并且設(shè)置正文編輯模塊的編輯功能。因?yàn)樵谠瓉?lái)的軟件結(jié)構(gòu)中,正文編輯模塊通過(guò)調(diào)用它的下層模塊來(lái)完成具體的編輯功能,所以需要有存根程序簡(jiǎn)化地模擬這些下層模塊。為了簡(jiǎn)單起見(jiàn),測(cè)試時(shí)可以設(shè)置的編輯功能只有修改(CHANGE)和添加(APPEND)兩種,用控制變量CFUNCT標(biāo)記要求的編輯功能,而且只用一個(gè)存根程序模擬正文編輯模塊的所有下層模塊。下面是用偽碼書(shū)寫(xiě)的存根程序和驅(qū)動(dòng)程序。第75頁(yè)/共113頁(yè)4.5.3集成測(cè)試集成測(cè)試是測(cè)試和組裝軟件的系統(tǒng)化技術(shù),在把模塊按照設(shè)計(jì)要求組裝起來(lái)的同時(shí)進(jìn)行測(cè)試,主要目標(biāo)是發(fā)現(xiàn)與接口有關(guān)的問(wèn)題。例如,數(shù)據(jù)穿過(guò)接口時(shí)可能丟失;一個(gè)模塊對(duì)另一個(gè)模塊可能有由于疏忽而造成的有害影響;把子功能組合起來(lái)可能不產(chǎn)生預(yù)期的主功能;個(gè)別看來(lái)是可以接受的誤差可能積累到不能接受的程度;全程數(shù)據(jù)結(jié)構(gòu)可能有問(wèn)題等等。不幸的是,可能發(fā)生的接口問(wèn)題多得不勝枚舉。由模塊組裝成程序時(shí)有兩種方法。一種方法是先分別測(cè)試每個(gè)模塊,再把所有模塊按設(shè)計(jì)要求放在一起結(jié)合成所要的程序,這種方法稱(chēng)為非漸增式測(cè)試方法;另一種方法是把下一個(gè)要測(cè)試的模塊同已經(jīng)測(cè)試好的那些模塊結(jié)合起來(lái)進(jìn)行測(cè)試,測(cè)試完以后再把下一個(gè)應(yīng)該測(cè)試的模塊結(jié)合進(jìn)來(lái)測(cè)試。這種每次增加一個(gè)模塊的方法稱(chēng)為漸增式測(cè)試。第76頁(yè)/共113頁(yè)

非漸增式測(cè)試一下子把所有模塊放在一起,并把整個(gè)程序作為一個(gè)整體來(lái)進(jìn)行測(cè)試,測(cè)試者面對(duì)的場(chǎng)面往往混亂不堪。測(cè)試時(shí)會(huì)遇到許許多多的錯(cuò)誤,改正錯(cuò)誤更是極端困難,因?yàn)樵邶嫶蟮某绦蛑邢胍\斷定位一個(gè)錯(cuò)誤是非常復(fù)雜非常困難的。而且一旦改正一個(gè)錯(cuò)誤之后,馬上又會(huì)遇到新的錯(cuò)誤,這個(gè)過(guò)程會(huì)繼續(xù)下去,看起來(lái)好像永遠(yuǎn)也沒(méi)有盡頭。漸增式測(cè)試與“一步到位”的非漸增式測(cè)試相反,把程序劃分成小段來(lái)構(gòu)造和測(cè)試,在這個(gè)過(guò)程中比較容易分離和改正錯(cuò)誤;對(duì)接口可能進(jìn)行更徹底的測(cè)試;而且可以使用系統(tǒng)化的測(cè)試方法。因此,在進(jìn)行集成測(cè)試時(shí)普遍使用漸增式測(cè)試方法。下面討論兩種不同的漸增式集成策略。第77頁(yè)/共113頁(yè)1.自頂向下集成自頂向下的集成(結(jié)合)方法是一個(gè)日益為人們廣泛采用的組裝軟件的途徑。從主控制模塊(主程序)開(kāi)始,沿著軟件的控制層次向下移動(dòng),從而逐漸把各個(gè)模塊結(jié)合起來(lái)。在把附屬于(以及最終附屬于)主控制模塊的那些模塊組裝到軟件結(jié)構(gòu)中去時(shí),或者使用深度優(yōu)先的策略,或者使用寬度優(yōu)先的策略。

第78頁(yè)/共113頁(yè)圖4.8

自頂向下結(jié)合

參看圖4.8,深度優(yōu)先的結(jié)合方法先組裝在軟件結(jié)構(gòu)的一條主控制通路上的所有模塊。選擇一條主控制通路取決于應(yīng)用的特點(diǎn),并且有很大任意性。

例如,選取左通路,首先結(jié)合模塊M1、M2和M5;其次,M8或M6(如果為了使M2具有適當(dāng)功能需要M6的話)將被結(jié)合進(jìn)來(lái)。然后構(gòu)造中央的和右側(cè)的控制通路。而寬度優(yōu)先的結(jié)合方法,是沿軟件結(jié)構(gòu)水平地移動(dòng),把處于同一個(gè)控制層次上的所有模塊組裝起來(lái)。對(duì)于圖4.8來(lái)說(shuō),首先結(jié)合模塊M2、M3和M4(代替存根程序S4)。然后結(jié)合下一個(gè)控制層次中的模塊M5、M6和M7;如此繼續(xù)進(jìn)行下去,直到所有模塊都被結(jié)合進(jìn)來(lái)為止。第79頁(yè)/共113頁(yè)2.自底向上集成自底向上測(cè)試從“原子”模塊(即在軟件結(jié)構(gòu)最低層的模塊)開(kāi)始組裝和測(cè)試。因?yàn)槭菑牡撞肯蛏辖Y(jié)合模塊,總能得到需要的下層模塊處理功能,所以不需要存根程序。

第80頁(yè)/共113頁(yè)圖4.9自底向上結(jié)合

首先把模塊組合成簇1、簇2和簇3,使用驅(qū)動(dòng)程序(圖中用虛線方框表示)對(duì)每個(gè)子功能簇進(jìn)行測(cè)試。簇1和簇2中的模塊附屬于模塊Ma,去掉驅(qū)動(dòng)程序D1和D2,把這兩個(gè)簇直接同Ma連接起來(lái)。類(lèi)似地,在和模塊Mb結(jié)合之前去掉簇3的驅(qū)動(dòng)程序D3。最終Ma和Mb這兩個(gè)模塊都與模塊Mc結(jié)合起來(lái)。圖4.9描繪了自底向上的結(jié)合過(guò)程。

第81頁(yè)/共113頁(yè)3.兩種集成測(cè)試策略的比較一般說(shuō)來(lái),一種方法的優(yōu)點(diǎn)正好對(duì)應(yīng)于另一種方法的缺點(diǎn)。自頂向下測(cè)試方法的主要優(yōu)點(diǎn)是不需要測(cè)試驅(qū)動(dòng)程序,能夠在測(cè)試階段的早期實(shí)現(xiàn)并驗(yàn)證系統(tǒng)的主要功能,而且能在早期發(fā)現(xiàn)上層模塊的接口錯(cuò)誤。自頂向下測(cè)試方法的主要缺點(diǎn)是需要存根程序,可能遇到與此相聯(lián)系的測(cè)試?yán)щy,低層關(guān)鍵模塊中的錯(cuò)誤發(fā)現(xiàn)較晚,而且用這種方法在早期不能充分展開(kāi)人力??梢钥闯觯缘紫蛏蠝y(cè)試方法的優(yōu)缺點(diǎn)與上述自頂向下測(cè)試方法的優(yōu)缺點(diǎn)剛好相反。

第82頁(yè)/共113頁(yè)

在測(cè)試實(shí)際的軟件系統(tǒng)時(shí),應(yīng)該根據(jù)軟件的特點(diǎn)以及工程進(jìn)度安排,選用適當(dāng)?shù)臏y(cè)試策略。一般說(shuō)來(lái),純粹自頂向下或純粹自底向上的策略可能都不實(shí)用,人們?cè)趯?shí)踐中創(chuàng)造出許多混合策略:改進(jìn)的自頂向下測(cè)試方法

混合法

第83頁(yè)/共113頁(yè)

在進(jìn)行集成測(cè)試的時(shí)候,測(cè)試人員應(yīng)該盡早識(shí)別出被測(cè)程序中的關(guān)鍵模塊。所謂關(guān)鍵模塊是指具有下述一個(gè)或多個(gè)特征的模塊:(1)與多項(xiàng)軟件需求有關(guān);(2)含有高層控制功能(模塊位于程序結(jié)構(gòu)的較高層次);(3)模塊本身是復(fù)雜的或容易出錯(cuò)的(可以用環(huán)形復(fù)雜度指示模塊的復(fù)雜程度);(4)有確定的性能需求。在集成測(cè)試期間應(yīng)該盡可能早地測(cè)試關(guān)鍵模塊,此外,回歸測(cè)試也應(yīng)該著重測(cè)試關(guān)鍵模塊的功能。第84頁(yè)/共113頁(yè)4.回歸測(cè)試在集成測(cè)試期間,每當(dāng)一個(gè)新模塊作為被測(cè)程序的一部分加進(jìn)來(lái)的時(shí)候,軟件就發(fā)生了變化:可能建立了新的數(shù)據(jù)流路徑,也可能出現(xiàn)了新的I/O操作或者激活了新的控制邏輯。這些變化有可能使原來(lái)正常工作的程序功能出現(xiàn)問(wèn)題。在集成測(cè)試范疇中,所謂回歸測(cè)試是指重新執(zhí)行已經(jīng)做過(guò)的測(cè)試的某個(gè)子集,以保證上述這些變化沒(méi)有帶來(lái)非預(yù)期的副作用。更廣義地說(shuō),任何成功的測(cè)試都會(huì)發(fā)現(xiàn)錯(cuò)誤,而且必須改正所發(fā)現(xiàn)的錯(cuò)誤。每當(dāng)改正軟件錯(cuò)誤的時(shí)候,軟件配置的某些成分(程序、文檔或數(shù)據(jù))也被修改了。回歸測(cè)試就是用于保證由于測(cè)試或其他原因引起的軟件變化,不會(huì)導(dǎo)致非預(yù)期的行為或額外錯(cuò)誤的測(cè)試活動(dòng)。

第85頁(yè)/共113頁(yè)4.5.4確認(rèn)測(cè)試確認(rèn)測(cè)試也稱(chēng)為驗(yàn)收測(cè)試,它的目標(biāo)是驗(yàn)證軟件的有效性。如果軟件的功能和性能如同用戶所合理地期待的那樣,那么,軟件就是有效的。需求分析階段產(chǎn)生的軟件需求規(guī)格說(shuō)明,準(zhǔn)確地描述了用戶對(duì)軟件的合理期望,因此是軟件有效性的標(biāo)準(zhǔn),也是進(jìn)行確認(rèn)測(cè)試的基礎(chǔ)。第86頁(yè)/共113頁(yè)1.確認(rèn)測(cè)試的范圍確認(rèn)測(cè)試必須有用戶積極參與,或者以用戶為主進(jìn)行。用戶應(yīng)該參加設(shè)計(jì)測(cè)試方案,使用用戶接口輸入測(cè)試數(shù)據(jù)并且分析評(píng)價(jià)測(cè)試的輸出結(jié)果。為了使用戶能夠積極主動(dòng)地參與確認(rèn)測(cè)試,特別是為了使用戶能有效地使用這個(gè)系統(tǒng),通常在驗(yàn)收之前由開(kāi)發(fā)部門(mén)對(duì)用戶進(jìn)行培訓(xùn)。確認(rèn)測(cè)試一般使用黑盒測(cè)試法。應(yīng)該仔細(xì)設(shè)計(jì)測(cè)試計(jì)劃和測(cè)試過(guò)程,測(cè)試計(jì)劃包括要進(jìn)行的測(cè)試的種類(lèi)和進(jìn)度安排,測(cè)試過(guò)程規(guī)定用來(lái)檢驗(yàn)軟件是否與需求一致的測(cè)試方案。通過(guò)測(cè)試要保證軟件能滿足所有功能要求,能達(dá)到每個(gè)性能要求,文檔資料是準(zhǔn)確而完整的,此外,還應(yīng)該保證軟件能滿足其他預(yù)定的要求(例如,可移植性、兼容性和可維護(hù)性等)。第87頁(yè)/共113頁(yè)

確認(rèn)測(cè)試有兩種可能的結(jié)果:●功能和性能與用戶要求一致,軟件是可以接受的;●功能或性能與用戶的要求有差距。在確認(rèn)測(cè)試期間發(fā)現(xiàn)的問(wèn)題,往往和需求分析階段分析員所犯的錯(cuò)誤有關(guān),而且這類(lèi)問(wèn)題的涉及面通常比較廣,因此解決起來(lái)也比較困難。為了確定解決確認(rèn)測(cè)試過(guò)程中發(fā)現(xiàn)的軟件缺陷或錯(cuò)誤的策略,軟件工程師通常需要和用戶充分協(xié)商。第88頁(yè)/共113頁(yè)2.復(fù)查軟件配置確認(rèn)測(cè)試的一項(xiàng)重要任務(wù)是復(fù)查軟件配置。復(fù)查的目的是,保證軟件配置的所有成分都齊全,各方面的質(zhì)量都符合要求,文檔內(nèi)容與程序完全一致,具有軟件維護(hù)階段所必須的細(xì)節(jié),而且全部文檔都已經(jīng)編好目錄。除了按軟件開(kāi)發(fā)合同規(guī)定的內(nèi)容和要求,由人工審查軟件配置之外,在確認(rèn)測(cè)試的過(guò)程中還應(yīng)該嚴(yán)格遵循用戶手冊(cè)以及其他操作程序,以便檢驗(yàn)這些手冊(cè)的完整性和正確性。必須仔細(xì)記錄測(cè)試期間發(fā)現(xiàn)的遺漏或錯(cuò)誤,并且適當(dāng)?shù)匮a(bǔ)充和改正。第89頁(yè)/共113頁(yè)3.Alpha測(cè)試和Beta測(cè)試如果軟件是為一個(gè)客戶開(kāi)發(fā)的,則可以進(jìn)行一系列驗(yàn)收測(cè)試以便用戶確認(rèn)所有需求都已滿足了。驗(yàn)收測(cè)試是由最終用戶而不是系統(tǒng)的開(kāi)發(fā)者進(jìn)行的。事實(shí)上,驗(yàn)收測(cè)試可以持續(xù)幾個(gè)星期或幾個(gè)月,因此可以發(fā)現(xiàn)隨著時(shí)間流逝可能會(huì)降低系統(tǒng)質(zhì)量的累積錯(cuò)誤。如果一個(gè)軟件是為許多客戶開(kāi)發(fā)的(例如,向大眾出售的盒裝軟件產(chǎn)品),那么讓每個(gè)客戶都進(jìn)行正式的驗(yàn)收測(cè)試是不現(xiàn)實(shí)的。在這種情況下,絕大多數(shù)軟件開(kāi)發(fā)商都使用被稱(chēng)為Alpha測(cè)試和Beta測(cè)試的過(guò)程,來(lái)發(fā)現(xiàn)那些看起來(lái)只有最終用戶才能發(fā)現(xiàn)的錯(cuò)誤。第90頁(yè)/共113頁(yè)Alpha測(cè)試由用戶在開(kāi)發(fā)者的場(chǎng)所進(jìn)行,并且在開(kāi)發(fā)者對(duì)用戶的“指導(dǎo)”下進(jìn)行測(cè)試。開(kāi)發(fā)者負(fù)責(zé)記錄錯(cuò)誤和使用中遇到的問(wèn)題??傊珹lpha測(cè)試是在受控的環(huán)境中進(jìn)行的。

Beta測(cè)試由軟件的最終用戶們?cè)谝粋€(gè)或多個(gè)客戶場(chǎng)所進(jìn)行。與Alpha測(cè)試不同,開(kāi)發(fā)者通常不在Beta測(cè)試的現(xiàn)場(chǎng),因此,Beta測(cè)試是軟件在開(kāi)發(fā)者不能控制的環(huán)境中的“真實(shí)”應(yīng)用。用戶記錄下在Beta測(cè)試過(guò)程中遇到的一切問(wèn)題(真實(shí)的或想象的),并且定期把這些問(wèn)題報(bào)告給開(kāi)發(fā)者。接收到Beta測(cè)試期間報(bào)告的問(wèn)題之后,軟件開(kāi)發(fā)者對(duì)產(chǎn)品進(jìn)行修改,并準(zhǔn)備向全體客戶發(fā)布最終的軟件產(chǎn)品。第91頁(yè)/共113頁(yè)4.6調(diào)試

僅就測(cè)試而言,它的目標(biāo)是發(fā)現(xiàn)軟件中的錯(cuò)誤,但是,發(fā)現(xiàn)錯(cuò)誤并不是我們的最終目的。軟件工程的根本目標(biāo),是開(kāi)發(fā)出高質(zhì)量的完全符合用戶需要的軟件產(chǎn)品,因此,通過(guò)測(cè)試發(fā)現(xiàn)軟件錯(cuò)誤之后還必須診斷并改正軟件錯(cuò)誤,這就是調(diào)試(也稱(chēng)為糾錯(cuò))的任務(wù)。調(diào)試作為成功的測(cè)試的后果而出現(xiàn),也就是說(shuō),調(diào)試是在測(cè)試發(fā)現(xiàn)錯(cuò)誤之后排除錯(cuò)誤的過(guò)程。雖然調(diào)試可以而且應(yīng)該是一個(gè)有序的過(guò)程,但是在很大程度上它仍然是一項(xiàng)技巧。軟件工程師在評(píng)估測(cè)試結(jié)果時(shí),往往僅面對(duì)著軟件問(wèn)題的癥狀,也就是說(shuō),錯(cuò)誤的外部表現(xiàn)和它的內(nèi)在原因之間可能并沒(méi)有明顯的聯(lián)系。調(diào)試就是把癥狀和原因聯(lián)系起來(lái)的尚未被人很好理解的智力過(guò)程。返回目錄第92頁(yè)/共113頁(yè)

調(diào)試不是測(cè)試,但是它與測(cè)試關(guān)系密切,它總是發(fā)生在測(cè)試之后。如圖4.10所示,調(diào)試過(guò)程從執(zhí)行一個(gè)測(cè)試用例開(kāi)始,評(píng)估測(cè)試結(jié)果,如果發(fā)現(xiàn)實(shí)際結(jié)果與預(yù)期結(jié)果不一致,則這種不一致就是一個(gè)癥狀,它表明在軟件中存在著隱藏的問(wèn)題。調(diào)試過(guò)程試圖找出產(chǎn)生癥狀的原因,并且改正軟件錯(cuò)誤。圖4.10

調(diào)試過(guò)程

4.6.1調(diào)試過(guò)程第93頁(yè)/共113頁(yè)4.6.2調(diào)試途徑無(wú)論采用什么方法,調(diào)試的根本目標(biāo)都是尋找出現(xiàn)軟件錯(cuò)誤的原因并正確地改正。這個(gè)目標(biāo)是通過(guò)把系統(tǒng)的評(píng)估、直覺(jué)和運(yùn)氣結(jié)合起來(lái)實(shí)現(xiàn)的。常見(jiàn)的調(diào)試途徑有蠻干法、回溯法和原因排除法等三種方法1.蠻干法2.回溯法3.原因排除法上述每一種方法都可以使用調(diào)試工具輔助完成,但是工具并不能代替對(duì)全部設(shè)計(jì)文檔和源程序的仔細(xì)評(píng)估。

第94頁(yè)/共113頁(yè)

一旦找到錯(cuò)誤就必須改正它,但是,前面已經(jīng)提醒過(guò),改正一個(gè)錯(cuò)誤可能引入更多的其他錯(cuò)誤,以至“得不償失”。因此,在動(dòng)手改正軟件錯(cuò)誤之前,每個(gè)軟件工程師都應(yīng)該仔細(xì)考慮下述三個(gè)問(wèn)題:●是否同樣的錯(cuò)誤也存在于程序的其他地方?在許多情況下,一個(gè)程序錯(cuò)誤是由錯(cuò)誤的邏輯思維模式引起的,而這種邏輯思維模式也可能用在別的地方。仔細(xì)分析這種邏輯模式,可能會(huì)發(fā)現(xiàn)其他錯(cuò)誤?!駥⒁M(jìn)行的修改可能會(huì)引入的“下一個(gè)錯(cuò)誤”是什么?在改正錯(cuò)誤之前應(yīng)該仔細(xì)研究源程序(最好也研究設(shè)計(jì)文檔),以評(píng)估邏輯和數(shù)據(jù)結(jié)構(gòu)的耦合程度。如果所要做的修改位于程序的高耦合段中,則在修改時(shí)必須特別小心謹(jǐn)慎?!駷榉乐菇窈蟪霈F(xiàn)類(lèi)似的錯(cuò)誤,應(yīng)該做什么?如果我們不僅修改了軟件產(chǎn)品還改進(jìn)了軟件過(guò)程,則不僅排除了現(xiàn)有程序中的錯(cuò)誤,還避免了今后在程序中可能出現(xiàn)的錯(cuò)誤。第95頁(yè)/共113頁(yè)4.7軟件可靠性4.7.1基本概念1.軟件可靠性的定義對(duì)于軟件可靠性有許多不同的定義,其中多數(shù)人承認(rèn)的一個(gè)定義是:軟件可靠性是程序在給定的時(shí)間間隔內(nèi),按照規(guī)格說(shuō)明書(shū)的規(guī)定成功地運(yùn)行的概率。在上述定義中包含的隨機(jī)變量是時(shí)間間隔。顯然,隨著運(yùn)行時(shí)間的增加,運(yùn)行時(shí)遇到程序錯(cuò)誤的概率也將增加,即可靠性隨著給定的時(shí)間間隔的加大而減少。根據(jù)IEEE的定義,術(shù)語(yǔ)“錯(cuò)誤”的含義是由開(kāi)發(fā)人員造成的軟件差錯(cuò),而術(shù)語(yǔ)“故障”的含義是由錯(cuò)誤引起軟件的不正確行為。在下面的論述中,我們將按照IEEE規(guī)定的含義使用這兩個(gè)術(shù)語(yǔ)。返回目錄第96頁(yè)/共113頁(yè)2.軟件的可用性通常用戶也很關(guān)注軟件系統(tǒng)可以使用的程度。一般說(shuō)來(lái),對(duì)于任何其故障是可以修復(fù)的系統(tǒng),都應(yīng)該同時(shí)使用可靠性和可用性衡量它的優(yōu)劣程度。軟件可用性的一個(gè)定義是:軟件可用性是程序在給定的時(shí)間點(diǎn),按照規(guī)格說(shuō)明書(shū)的規(guī)定,成功地運(yùn)行的概率??煽啃院涂捎眯灾g的主要差別是,可靠性意味著在0到t這段時(shí)間間隔內(nèi)系統(tǒng)沒(méi)有失效,而可用性只意味著在時(shí)刻t,系統(tǒng)是正常運(yùn)行的。因此,如果在時(shí)刻t系統(tǒng)是可用的,則有下述種種可能:在0到t這段時(shí)間內(nèi),系統(tǒng)一直沒(méi)失效(可靠);在這段時(shí)間內(nèi)失效了一次,但是又修復(fù)了;在這段時(shí)間內(nèi)失效了兩次修復(fù)了兩次;……

第97頁(yè)/共113頁(yè)

如果在一段時(shí)間內(nèi),軟件系統(tǒng)故障停機(jī)時(shí)間分別為td1,td2…,正常運(yùn)行時(shí)間分別為tu1,tu2,…,則系統(tǒng)的穩(wěn)態(tài)可用性為:(4.1)其中Tup=∑tui,Tdown=∑tdi

第98頁(yè)/共113頁(yè)

如果引入系統(tǒng)平均無(wú)故障時(shí)間MTTF和平均維修時(shí)間MTTR的概念,則(4.1)式可以變成

(4.2)平均維修時(shí)間MTTR是修復(fù)一個(gè)故障平均需要用的時(shí)間,它取決于維護(hù)人員的技術(shù)水平和對(duì)系統(tǒng)的熟悉程度,也和系統(tǒng)的可維護(hù)性有重要關(guān)系,本書(shū)下一章將討論軟件維護(hù)問(wèn)題。平均無(wú)故障時(shí)間MTTF是系統(tǒng)按規(guī)格說(shuō)明書(shū)規(guī)定成功地運(yùn)行的平均時(shí)間,它主要取決于系統(tǒng)中潛伏的錯(cuò)誤的數(shù)目,因此和測(cè)試的關(guān)系十分密切。第99頁(yè)/共113頁(yè)4.7.2估算平均無(wú)故障時(shí)間的方法軟件的平均無(wú)故障時(shí)間MTTF是一個(gè)重要的質(zhì)量指標(biāo),往往作為對(duì)軟件的一項(xiàng)要求,由用戶提出來(lái)。為了估算MTTF,首先引入一些有關(guān)的量。1.符號(hào)在估算MTTF的過(guò)程中使用下述符號(hào)表示有關(guān)的數(shù)量:

ET——測(cè)試之前程序中錯(cuò)誤總數(shù);

IT——程序長(zhǎng)度(機(jī)器指令總數(shù));

τ——測(cè)試(包括調(diào)試)時(shí)間;

Ed(τ)——在0至τ期間發(fā)現(xiàn)的錯(cuò)誤數(shù);

Ec(τ)——在0至τ期間改正的錯(cuò)誤數(shù)。第100頁(yè)/共113頁(yè)2.基本假定根據(jù)經(jīng)驗(yàn)數(shù)據(jù),可以作出下述假定:(1)在類(lèi)似的程序中,單位長(zhǎng)度里的錯(cuò)誤數(shù)ET/IT近似為常數(shù)。美國(guó)的一些統(tǒng)計(jì)數(shù)字表明,通常0.5×10-2≤ET/IT≤2×10-2

也就是說(shuō),在測(cè)試之前每1000條指令中大約有5~20個(gè)錯(cuò)誤。第101頁(yè)/共113頁(yè)

(2)失效率正比于軟件中剩余的(潛藏的)錯(cuò)誤數(shù),而平均無(wú)故障時(shí)間MTTF與剩余的錯(cuò)誤數(shù)成反比。此外,為了簡(jiǎn)化討論,假設(shè)發(fā)現(xiàn)的每一個(gè)錯(cuò)誤都立即正確地改正了(即,調(diào)試過(guò)程沒(méi)有引入新的錯(cuò)誤)。因此Ec(τ)=Ed(τ)剩余的錯(cuò)誤數(shù)為Er(τ)=ET-Ec(τ)(4.3)單位長(zhǎng)度程序中剩余的錯(cuò)誤數(shù)為εr(τ)=ET/IT-Ec(τ)/IT

第102頁(yè)/共113頁(yè)3.估算平均無(wú)故障時(shí)間經(jīng)驗(yàn)表明,平均無(wú)故障時(shí)間與單位長(zhǎng)度程序中剩余的錯(cuò)誤數(shù)成反比,即(4.5)其中K為常數(shù),它的值應(yīng)該根據(jù)經(jīng)驗(yàn)選取。美國(guó)的一些統(tǒng)計(jì)數(shù)字表明,K的典型值是200

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論