《軟件測試基礎(chǔ)》課件-第8章_第1頁
《軟件測試基礎(chǔ)》課件-第8章_第2頁
《軟件測試基礎(chǔ)》課件-第8章_第3頁
《軟件測試基礎(chǔ)》課件-第8章_第4頁
《軟件測試基礎(chǔ)》課件-第8章_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章面向?qū)ο鬁y試

8.1面向?qū)ο笥绊憸y試8.2面向?qū)ο鬁y試模型8.3面向?qū)ο蠓治鰷y試8.4面向?qū)ο笤O(shè)計測試8.5面向?qū)ο髥卧獪y試8.6面向?qū)ο蠹蓽y試8.7面向?qū)ο蟮南到y(tǒng)測試8.8思考與習(xí)題

8.1面向?qū)ο笥绊憸y試

傳統(tǒng)的測試軟件是從“小型測試”開始,逐步過渡到“大型測試”,即從單元測試開始,逐步進(jìn)入集成測試,最后進(jìn)行確認(rèn)測試和系統(tǒng)測試。對于傳統(tǒng)的軟件系統(tǒng)來說,單元測試集中測試最小的可編譯的構(gòu)件單元(模塊);單元測試結(jié)束之后,集成到系統(tǒng)中進(jìn)行一系列的回歸測試,以便發(fā)現(xiàn)模塊接口錯誤和新單元加入到系統(tǒng)中來所帶的副作用;最后,把系統(tǒng)作為一個整體來測試,以發(fā)現(xiàn)軟件需求中的錯誤。面向?qū)ο蟮能浖Y(jié)構(gòu)與傳統(tǒng)的功能模塊結(jié)構(gòu)有所區(qū)別,類作為構(gòu)成面向?qū)ο蟪绦虻幕驹兀庋b了數(shù)據(jù)及作用在數(shù)據(jù)上的操作。父類定義共享的公共特征,子類除繼承父類所有特征外,還引入了新的特征。

面向?qū)ο蠹夹g(shù)具有信息隱蔽、封裝、繼承、多態(tài)和動態(tài)綁定等特性,提高了軟件開發(fā)質(zhì)量,但同時也給軟件測試提出了新的問題,增加了測試的難度。

傳統(tǒng)軟件的測試往往關(guān)注模塊的算法細(xì)節(jié)和模塊接口間流動的數(shù)據(jù),面向?qū)ο筌浖念悳y試由封裝在類中的操作和類的狀態(tài)行為所驅(qū)動。下面具體分析面向?qū)ο蠹夹g(shù)對軟件測試的影響。8.1.1封裝性影響測試

類的重要特征之一是信息隱蔽,它通過對象的封裝性實現(xiàn)。封裝將一個對象的各個部分聚集在一個邏輯單元內(nèi),對象的訪問被限制在一個嚴(yán)格定義的接口上,信息隱蔽只讓用戶知道某些信息,其它信息被隱藏起來。信息隱蔽與封裝性限制了對象屬性對外界的可見性與外界對它的操作權(quán)限,使得類的具體實現(xiàn)與它的接口相分離,降低類和程序其它各部分之間的依賴,促進(jìn)程序的模塊化,避免外界對其不合理操作并防止錯誤的擴散。信息隱蔽給測試帶來許多問題。在面向?qū)ο筌浖校瑢ο笮袨槭潜粍拥?,在接受到相關(guān)外部信息后才被激活,進(jìn)行相關(guān)操作返回結(jié)果。在工作過程中,對象的狀態(tài)可能發(fā)生變化而進(jìn)入新的狀態(tài)。通過發(fā)送一系列信息創(chuàng)建和激活對象,看其是否完成預(yù)期操作并處于正確狀態(tài),但是由于信息隱蔽與封裝機制,類的內(nèi)部屬性和狀態(tài)對外界是不可見的,只能通過類自身的方法獲得,這給類測試時測試用例執(zhí)行是否處于預(yù)期狀態(tài)的判斷帶來困難,在測試時添加一些對象的實現(xiàn)方式和內(nèi)部狀態(tài)的函數(shù)考察對象的狀態(tài)變化。8.1.2繼承性影響測試

1)反擴展性公理

反擴展性公理認(rèn)為若有兩個功能相同而實現(xiàn)不同的程序,對其中一個程序是充分的測試數(shù)據(jù)集未必對另一個也是充分的測試數(shù)據(jù)集。這一公理表明若在子類中重定義了某一繼承的方法,即使兩個函數(shù)完成相同的功能,對被繼承方法是充分的測試數(shù)據(jù)集未必對重定義的方法是充分的。

2)反分解性公理

反分解性公理認(rèn)為一個程序進(jìn)行過充分的測試,并不表示其中的成分都得到了充分的測試。因為這些獨立的成分有可能被用在其它的環(huán)境中,此時就需要在新的環(huán)境中對這個部分重新進(jìn)行測試。因此,若一個類得到了充分的測試,當(dāng)其被子類繼承后,繼承的方法在子類的環(huán)境中的行為特征需要重新測試。

3)反組合性公理

反組合性公理認(rèn)為一個測試數(shù)據(jù)集對于程序中各個單元都是充分的并不表示它對整個程序是充分的,因為獨立部分交互時會產(chǎn)生在隔離狀態(tài)下所不具備的新特性。這一公理表明,若對父類中某一方法進(jìn)行了重定義,僅對該方法自身或其所在的類進(jìn)行重新測試是不夠的,還必須測試其它有關(guān)的類(如子類和引用類)。

Perry和Kaiser對Weyuker觀點總結(jié)如下:有關(guān)充分測試的直覺的結(jié)論可能是錯誤的。隨著繼承層次的加深,雖然可供重用的類越來越多,編程效率也越來越高,但無形中加大了測試的工作量和難度。同時,遞增式軟件開發(fā)過程中,如果父類發(fā)生修改,這種變化會自動傳播到所有子類,使得父類和子類都必須重新測試。所以說,繼承并未簡化測試問題,反而使測試更加復(fù)雜。8.1.3多態(tài)性影響測試

多態(tài)使得面向?qū)ο蟪绦驅(qū)ν獬尸F(xiàn)出強大的處理能力,但同時卻使得程序內(nèi)“同一”函數(shù)的行為復(fù)雜化,多態(tài)促成了子類型替換。一方面,子類型替換使對象的狀態(tài)難以確定。如果一個對象包含了A類型的對象變量,則A類型的所有子類型的對象也允許賦給該變量。程序運行過程中,該變量可能引用不同類型的對象,其結(jié)構(gòu)不斷變化。另一方面,子類型替換使得向父類對象發(fā)送的消息也允許向該類的子類對象發(fā)送。如果A類有兩個子類B和C,D類也有兩個子類E和F,A類對象向D類對象發(fā)送消息m,則測試A類對象發(fā)出的消息m時,需考慮所有可能的組合。

8.2面向?qū)ο鬁y試模型

面向?qū)ο箝_發(fā)分為面向?qū)ο蠓治觥⒚嫦驅(qū)ο笤O(shè)計和面向?qū)ο缶幊倘齻€階段。分析階段產(chǎn)生整個問題空間的抽象描述,設(shè)計出類和類結(jié)構(gòu),最后形成代碼。面向?qū)ο鬁y試模型能有效地將分析、設(shè)計的文本或圖表代碼化。測試模型如圖8.1所示。圖8.1面向?qū)ο鬁y試模型

8.3面向?qū)ο蠓治鰷y試

1.對象測試

OOA中認(rèn)定的對象是對問題空間中實例的抽象,可從以下方面對其進(jìn)行測試:

(1)認(rèn)定的對象是否全面,問題空間中所有涉及到的實例是否都反映在認(rèn)定的抽象對象中。

(2)認(rèn)定的對象是否具有多個屬性。只有一個屬性的對象通常應(yīng)看成其它對象的屬性,而不是抽象為獨立的對象。

(3)對認(rèn)定為同一對象的實例是否有共同的、區(qū)別于其它實例的共同屬性。

(4)對認(rèn)定為同一對象的實例是否提供或需要相同的服務(wù),如果服務(wù)隨著不同的實例而變化,認(rèn)定的對象就需要分解或利用繼承性來分類表示。

(5)系統(tǒng)沒有必要始終保持對象代表的實例信息,提供或者得到關(guān)于它的服務(wù),認(rèn)定的對象也無必要。

(6)認(rèn)定的對象的名稱應(yīng)該盡量準(zhǔn)確、適用。

2.結(jié)構(gòu)測試

1)對認(rèn)定的分類結(jié)構(gòu)的測試

(1)對于結(jié)構(gòu)中處于高層的對象,是否在問題空間中含有不同于下一層對象的特殊可能性,即是否能派生出下一層對象。

(2)對于結(jié)構(gòu)中處于同低層的對象,是否能抽象出在現(xiàn)實中有意義的更一般的上層對象。

(3)對所有認(rèn)定的對象,是否能在問題空間內(nèi)抽象出在現(xiàn)實中有意義的對象。

(4)高層的對象的特性是否完全體現(xiàn)下層的共性。

(5)低層的對象是否具有高層對象特性基礎(chǔ)上的特殊性。

2)對認(rèn)定的組裝結(jié)構(gòu)的測試

(1)整體和部件的組裝關(guān)系是否符合現(xiàn)實的關(guān)系。

(2)整體和部件是否在考慮的問題空間中有實際應(yīng)用。

(3)整體中是否遺漏了反映在問題空間中有用的部件。

(4)部件是否能夠在問題空間中組裝新的有現(xiàn)實意義的整體。

3.主題測試

主題如同文章中的內(nèi)容概要,是在對象和結(jié)構(gòu)基礎(chǔ)上抽象,其提供OOA分析結(jié)果的可見性。主題測試應(yīng)該考慮以下方面:

(1)貫徹GeorgeMiller的“7+2”原則,如果主題個數(shù)超過7個,就要對相關(guān)密切的主題進(jìn)行歸并。

(2)主題所反映的一組對象和結(jié)構(gòu)是否具有相同和相近的屬性及服務(wù)。

(3)認(rèn)定的主題是否是對象和結(jié)構(gòu)更高層的抽象,是否便于理解OOA。

(4)主題間的消息聯(lián)系是否代表了主題所反映的對象和結(jié)構(gòu)之間的所有關(guān)聯(lián)。

4.屬性和實例關(guān)聯(lián)測試

屬性用來描述對象或結(jié)構(gòu)所反映的實例特性。實例關(guān)聯(lián)用于反映實例集合間的映射關(guān)系。對屬性和實例關(guān)聯(lián)的測試從如下方面考慮:

(1)定義的屬性是否對相應(yīng)的對象和分類結(jié)構(gòu)的每個實例都適用。

(2)定義的屬性在現(xiàn)實世界是否與這種實例關(guān)系密切。

(3)定義的屬性在問題空間是否與這種實例關(guān)系密切。

(4)定義的屬性是否能夠不依賴于其它屬性被獨立理解。

(5)定義的屬性在分類結(jié)構(gòu)中的位置是否恰當(dāng),低層對象的共有屬性是否在上層對象屬性體現(xiàn)。

(6)在問題空間中每個對象的屬性是否定義完整。

(7)定義的實例關(guān)聯(lián)是否符合現(xiàn)實。

(8)在問題空間中實例關(guān)聯(lián)是否定義完整,特別需要注意一對多和多對多的實例關(guān)聯(lián)。

5.服務(wù)和消息關(guān)聯(lián)測試

服務(wù)定義了每種對象和結(jié)構(gòu)在問題空間所要求的行為。問題空間中實例的通信在OOA中相應(yīng)地定義為消息關(guān)聯(lián)。對定義的服務(wù)和消息關(guān)聯(lián)的測試可從如下方面進(jìn)行:

(1)對象和結(jié)構(gòu)在問題空間的不同狀態(tài)是否定義了相應(yīng)的服務(wù)。

(2)對象或結(jié)構(gòu)所需要的服務(wù)是否都定義了相應(yīng)的消息關(guān)聯(lián)。

(3)定義的消息關(guān)聯(lián)所指引的服務(wù)提供是否正確。

(4)沿著消息關(guān)聯(lián)執(zhí)行的線程是否合理,是否符合現(xiàn)實過程。

(5)定義的服務(wù)是否重復(fù),是否定義了能夠得到的服務(wù)。

面向?qū)ο蠓治鰷y試如表8.1所示。

8.4面向?qū)ο笤O(shè)計測試

結(jié)構(gòu)化設(shè)計方法采用面向作業(yè)的設(shè)計方法,把系統(tǒng)分解為一組作業(yè)。面向?qū)ο笤O(shè)計采用“造型的觀點”,是以O(shè)OA為基礎(chǔ)歸納出類,建立類結(jié)構(gòu),實現(xiàn)分析結(jié)果對問題空間的抽象,設(shè)計類的服務(wù)。由此可見,OOD是OOA的進(jìn)一步細(xì)化和抽象,其界限通常難以嚴(yán)格區(qū)分。OOD確定類和類結(jié)構(gòu)不僅是滿足當(dāng)前需求分析的要求,更重要的是通過重新組合或加以適當(dāng)?shù)难a充,實現(xiàn)功能的重用和擴增。

1.對認(rèn)定類測試

OOD認(rèn)定的類是OOA中認(rèn)定的對象,是對象服務(wù)和屬性的抽象。認(rèn)定類應(yīng)該盡量是基礎(chǔ)類,這樣便于維護(hù)和重用。

測試認(rèn)定類有如下一些準(zhǔn)則:

(1)是否涵蓋了OOA中所有認(rèn)定的對象。

(2)是否能體現(xiàn)OOA中定義的屬性。

(3)是否能實現(xiàn)OOA中定義的服務(wù)。

(4)是否對應(yīng)著一個含義明確的數(shù)據(jù)抽象。

(5)是否盡可能少地依賴其它類。

2.對類層次結(jié)構(gòu)測試

OOD的類層次結(jié)構(gòu)基于OOA的分類結(jié)構(gòu)產(chǎn)生,體現(xiàn)了父類和子類之間的一般性和特殊性。類層次結(jié)構(gòu)是在解空間構(gòu)造實現(xiàn)全部功能的結(jié)構(gòu)框架。測試包含如下方面:

(1)類層次結(jié)構(gòu)是否涵蓋了所有定義的類。

(2)是否能體現(xiàn)OOA中所定義的實例關(guān)聯(lián)。

(3)是否能實現(xiàn)OOA中所定義的消息關(guān)聯(lián)。

(4)子類是否具有父類沒有的新特性。

(5)子類間的共同特性是否完全在父類中得以體現(xiàn)。

3.對類庫支持測試

類庫主要用于支持軟件開發(fā)的重用,對類庫的支持屬于類層次結(jié)構(gòu)的組織問題。由于類庫并不直接影響軟件的開發(fā)和功能實現(xiàn),因此類庫的測試往往作為對高質(zhì)量類層次結(jié)構(gòu)的評估。其測試點如下:

(1)一組子類中關(guān)于某種含義相同或基本相同的操作是否有相同的接口。

(2)類中方法功能是否較單純,相應(yīng)的代碼行是否較少,一般建議不超過30行。

(3)類的層次結(jié)構(gòu)是否深度大、寬度小。

8.5面向?qū)ο髥卧獪y試

8.5.1功能性和結(jié)構(gòu)性測試

類測試有兩種主要的方式:功能性測試和結(jié)構(gòu)性測試。功能性測試和結(jié)構(gòu)性測試分別對應(yīng)傳統(tǒng)測試的黑盒測試和白盒測試。功能性測試以類的規(guī)格說明為基礎(chǔ),主要檢查類是否符合規(guī)格說明的要求,包括類的規(guī)格說明和方法的規(guī)格說明兩個層次。例如,對于Stack類,檢查操作是否滿足LIFO規(guī)則。結(jié)構(gòu)性測試從程序出發(fā),對方法進(jìn)行測試,考慮代碼是否正確,Stack類檢查代碼是否執(zhí)行正確且至少執(zhí)行過一次。

測試類的方法指對方法調(diào)用關(guān)系進(jìn)行測試。測試每個方法的所有輸入情況,并對這些方法之間的接口進(jìn)行測試。對類的構(gòu)造函數(shù)參數(shù)以及消息序列進(jìn)行選擇以保證其在狀態(tài)集合下正常工作。因此,對類的測試分成如下兩個層次:方法內(nèi)測試和方法間測試。

1)方法內(nèi)測試

方法內(nèi)測試考慮類中方法,等效于傳統(tǒng)程序中單個過程的測試,傳統(tǒng)測試技術(shù)(如邏輯覆蓋、等價類劃分、邊界值分析和錯誤推測等方法)仍然作為測試類中每個方法的主要手段。與傳統(tǒng)單元測試的最大差別在于方法內(nèi)測試改變了它所在實例的狀態(tài),這就要求對隱藏的狀態(tài)信息進(jìn)行評估。

面向?qū)ο筌浖蟹椒ǖ膱?zhí)行是通過消息驅(qū)動執(zhí)行的。測試類中的方法,必須用驅(qū)動程序?qū)Ρ粶y方法通過發(fā)送消息來驅(qū)動執(zhí)行。如果被測試模塊或者方法調(diào)用其它模塊或方法,則需要設(shè)計一個模擬被調(diào)程序功能的存根程序代替。驅(qū)動程序、存根程序及被測模塊或方法組成一個獨立的可執(zhí)行單元。

2)方法間測試

方法間測試考慮類中方法之間的相互作用,對方法進(jìn)行綜合測試。單獨測試一個方法時,只考慮其本身執(zhí)行的情況,而沒有考慮方法的協(xié)作關(guān)系。方法間測試考慮一個方法調(diào)用本對象類中的其它方法,或其它類的方法之間的通信情況。

類的操作被封裝在類中,對象之間通過發(fā)送消息啟動操作,對象作為一個多入口模塊,必須考慮測試方法的不同次序組合的情況。當(dāng)一個類中方法的數(shù)目較多時,次序的組合數(shù)目將非常多。對于操作的次序組合以及動作的順序問題,測試用例中加入了激發(fā)調(diào)用信息,檢查它們是否正確運行。對于同一類中方法之間的調(diào)用,遍歷類的所有主要狀態(tài)。同時,選出最可能發(fā)現(xiàn)屬性和操作錯誤的情況,重點進(jìn)行測試。8.5.2測試用例的設(shè)計和選擇

1.測試用例設(shè)計

傳統(tǒng)軟件測試用例設(shè)計從軟件的各個模塊算法出發(fā),而面向?qū)ο?OO)軟件測試用例著眼于操作序列,以實現(xiàn)對類的說明。

OO測試用例設(shè)計對OO的五個特性(局域性、封裝性、信息隱藏、繼承性和抽象)進(jìn)行測試。Berard提出了測試用例的設(shè)計方法,關(guān)于設(shè)計合適的操作序列以測試類的狀態(tài),主要原則包括:

(1)對每個測試用例應(yīng)當(dāng)給予特殊的標(biāo)識,并且還應(yīng)當(dāng)與測試的類有明確的聯(lián)系。

(2)測試目的應(yīng)當(dāng)明確。

(3)應(yīng)當(dāng)為每個測試用例開發(fā)一個測試步驟列表。

2.基于概率分布的測試用例抽樣

總體是指所有可能被執(zhí)行的測試用例,包括所有前置條件和所有輸入值可能的組合情況。樣本是基于概率分布選擇的子集,子集的使用頻率越高,被選中的概率越大。

樣本集合中每個樣本代表一個特定的個體。例如,用例模型作為測試用例分層的基礎(chǔ),挑選出一個測試用例的抽樣,選擇一個測試系列,并不要求一定要首先明確如何來確定測試用例的總體。構(gòu)建測試用例的一個測試系列,將類說明作為測試用例的來源,運用一種抽樣方法對測試進(jìn)行補充,減少測試的數(shù)目。

【例8-1】

類的實例變量取值范圍為0~359,采用相關(guān)測試方法設(shè)計測試用例。

【解答】(1)采用基于邊界值的測試方法,取0值周圍的-1、0、1三種測試和359附近的358、359、400等測試用例。(2)采用隨機測試方法,使用隨機數(shù)發(fā)生器random()。由于每個測試用例的抽樣為(0~359),則設(shè)計int(random()*360)和int(-1*random()*360)進(jìn)行隨機的抽樣,每個值都在該區(qū)間內(nèi),且每個值被選中的概率相等,測試不同的值。

8.6面向?qū)ο蠹蓽y試

8.6.1概述

傳統(tǒng)面向過程的軟件模塊具有層次性,模塊之間存在著控制關(guān)系。面向?qū)ο筌浖δ苌⒉荚诓煌愔?,通過消息傳遞提供服務(wù)。由于面向?qū)ο筌浖]有一個層次的控制結(jié)構(gòu),傳統(tǒng)軟件自頂向下和自底向上的組裝策略意義不大,構(gòu)成類的各個部件之間存在直接和非直接交互,軟件的控制流無法確定,采用傳統(tǒng)的將操作組裝到類中的增值式組裝常常行不通。集成測試關(guān)注于系統(tǒng)的結(jié)構(gòu)和類之間的相互作用,測試步驟一般分成兩步,首先進(jìn)行靜態(tài)測試,然后進(jìn)行動態(tài)測試。靜態(tài)測試主要針對程序的結(jié)構(gòu)進(jìn)行,檢測程序結(jié)構(gòu)是否符合設(shè)計要求,采用逆向工程測試工具得到類的關(guān)系圖和函數(shù)關(guān)系圖,與面向?qū)ο笤O(shè)計規(guī)格說明比較檢測程序結(jié)構(gòu)和實現(xiàn)上是否有缺陷,是否符合需求設(shè)計。

動態(tài)測試根據(jù)功能結(jié)構(gòu)圖、類關(guān)系圖或者實體關(guān)系圖,確定不需要被重復(fù)測試的部分,通過覆蓋標(biāo)準(zhǔn)減少測試工作量。8.6.2面向?qū)ο蠼换y試

1.概述

面向?qū)ο筌浖扇舾蓪ο蠼M成,通過對象之間的相互協(xié)作實現(xiàn)既定功能。交互既包含對象和其組成對象之間的消息,還包含對象和與之相關(guān)的其它對象之間的消息,是一系列參與交互的對象協(xié)作中的消息的集合。例如,對象作為參數(shù)傳遞給另一對象,或者當(dāng)一個對象包含另一對象的引用并將其作為這個對象狀態(tài)的一部分時,對象的交互就會發(fā)生。

2.交互類型

1)測試匯集類

匯集類是指有些類的說明中使用對象,但是實際上從不和這些對象進(jìn)行協(xié)作。編譯器和開發(fā)環(huán)境的類庫通常包含匯集類。例如,C++的模板庫、列表、堆棧、隊列和映射等管理對象。匯集類一般具有如下行為:

(1)存放這些對象的引用;

(2)創(chuàng)建這些對象的實例;

(3)刪除這些對象的實例。

2)測試協(xié)作類

凡不是匯集類的非原始類就是協(xié)作類。協(xié)作類是

溫馨提示

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

評論

0/150

提交評論