2019年11月全國計(jì)算機(jī)技術(shù)與軟件專業(yè)技術(shù)資格(水平)考試《軟件評(píng)測(cè)師(中級(jí))》復(fù)習(xí)全書【核心講義+歷年真題詳解】
- 2019年11月全國計(jì)算機(jī)技術(shù)與軟件專業(yè)技術(shù)資格(水平)考試《軟件評(píng)測(cè)師(中級(jí))》復(fù)習(xí)全書【核心講義+歷年真題詳解】
- 圣才電子書
- 13269字
- 2021-06-04 11:25:47
第7章 面向?qū)ο蟮能浖y(cè)試技術(shù)
7.1 面向?qū)ο鬁y(cè)試概述
一、優(yōu)點(diǎn)
對(duì)象概念對(duì)軟件開發(fā)具有極大的好處,用戶應(yīng)用OOP(面向?qū)ο缶幊蹋┘夹g(shù)可只編寫一次代碼而在今后反復(fù)重用,反之,則多半要在應(yīng)用程序內(nèi)部各個(gè)部分反復(fù)多次地編寫同樣的功能代碼。故OOP減少了編寫代碼的總量,加快了開發(fā)的進(jìn)度。
二、缺點(diǎn)
面向?qū)ο缶幊檀嬖谝恍┕逃械娜秉c(diǎn)。例如:
(1)某個(gè)類被修改了,則所有依賴該類的代碼都必須重新測(cè)試,而且,還可能需要重新修改依賴類以支持類的變更;
(2)如果相關(guān)開發(fā)文檔沒有得到仔細(xì)的維護(hù),則很難確定哪些代碼采用了父類。而且,如果在開發(fā)后期發(fā)現(xiàn)了軟件中的錯(cuò)誤,很可能會(huì)影響應(yīng)用程序中絕大部分的代碼。
三、結(jié)論
面向?qū)ο蠹夹g(shù)的基本思想表明該技術(shù)開發(fā)出來的軟件應(yīng)該有更高的質(zhì)量,但由于無論采用何種編程技術(shù),編程人員的錯(cuò)誤都不可避免,且由于面向?qū)ο蠹夹g(shù)開發(fā)的軟件代碼重用率高,更需要嚴(yán)格的測(cè)試,避免錯(cuò)誤的繁衍,因此軟件測(cè)試需要新的測(cè)試?yán)砟詈蜏y(cè)試方法。
7.2 面向?qū)ο蠹夹g(shù)
一、基本概念
1.對(duì)象
現(xiàn)實(shí)世界中任何實(shí)體都可以看作是對(duì)象,面向?qū)ο笫乾F(xiàn)實(shí)世界模型的自然延伸。對(duì)象之間通過消息相互作用。另外,現(xiàn)實(shí)世界中任何實(shí)體都可歸屬于某類事物,任何對(duì)象都是某一類事物的實(shí)例。面向?qū)ο蟮木幊陶Z言以對(duì)象為中心,以消息為驅(qū)動(dòng)。用公式表示,過程式編程語言為:程序=算法+數(shù)據(jù);面向?qū)ο缶幊陶Z言為:程序=對(duì)象+消息。
2.類
類是面向?qū)ο笤O(shè)計(jì)的核心,類是實(shí)現(xiàn)抽象類型的工具,是通過抽象數(shù)據(jù)類型的方法來實(shí)現(xiàn)的一種新的數(shù)據(jù)類型。
3.類和對(duì)象的關(guān)系
類是對(duì)某一類對(duì)象的抽象,而對(duì)象是某一種類的實(shí)例,故類和對(duì)象是密切相關(guān)的。沒有脫離對(duì)象的類,也沒有不依賴于類的對(duì)象。
二、封裝、繼承和多態(tài)性
1.封裝
(1)定義
封裝是將數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)銜接在一起,構(gòu)成的一個(gè)具有類類型的對(duì)象的描述。封裝把數(shù)據(jù)和操作結(jié)合成一體,使程序結(jié)構(gòu)更加緊湊,同時(shí)避免數(shù)據(jù)紊亂帶來的調(diào)試與維護(hù)的困難。
(2)要點(diǎn)
①封裝要求一個(gè)對(duì)象應(yīng)具備明確的功能,并且有一個(gè)或幾個(gè)接口以便和其他對(duì)象相互作用。
②對(duì)象的內(nèi)部實(shí)現(xiàn)(代碼和數(shù)據(jù))受保護(hù),外界不能進(jìn)行訪問,只有對(duì)象中的代碼才可訪問該對(duì)象的內(nèi)部數(shù)據(jù)。對(duì)象的內(nèi)部數(shù)據(jù)結(jié)構(gòu)的不可訪問性稱為數(shù)據(jù)隱藏。封裝簡(jiǎn)化程序員對(duì)對(duì)象的使用,只需要知道輸入什么和輸出什么,對(duì)類內(nèi)部進(jìn)行何種操作不必追究。
例如,類Test(以C++為例):
輸出結(jié)果是16,對(duì)于main()里的操作,無法更改類Test中的Value值,value是定義好的常量,這樣保護(hù)了數(shù)據(jù)Value,實(shí)現(xiàn)了數(shù)據(jù)的隱藏。函數(shù)SetValue()和數(shù)據(jù)Value結(jié)合在一起操作,就實(shí)現(xiàn)了封裝。
2.繼承
(1)定義
繼承即可以從一個(gè)類派生另一個(gè)類。派生類(也稱為子類)繼承了其父類和祖先類的數(shù)據(jù)成員和成員函數(shù)。派生類可增加新的屬性和新的操作,另外,派生類在繼承的成員函數(shù)不合適時(shí)也可以放棄不用,繼承增加軟件的可擴(kuò)充性,并為代碼重用提供強(qiáng)有力的手段。
(2)舉例
水果是基類,具有好吃、營(yíng)養(yǎng)等水果的基本特征;香蕉和蘋果是水果的派生類,二者在繼承水果類的一些特征的基礎(chǔ)上,增加了如特殊的味道、形狀等特征;紅富士蘋果和青蘋果是蘋果類的派生類,二者又增加各自的新特征。如此繼承設(shè)計(jì),可以大大減少工作量。
①程序舉例
例如(C++程序),先設(shè)計(jì)水果類Friut:
②蘋果類Apple需要與水果類Friut同樣的成員函數(shù)void Eat()和void Taste(),另外增加新的函數(shù)void Color()和void Shape()。在設(shè)計(jì)時(shí),不需要重寫void Eat()和void Taste(),只需要繼承水果類即可,蘋果類的實(shí)際代碼如下:
3.多態(tài)性
(1)定義
多態(tài)性即多種表現(xiàn)形式,具體表述為“一個(gè)對(duì)外接口,多個(gè)內(nèi)在實(shí)現(xiàn)方法”。
多態(tài)性的實(shí)現(xiàn),一般通過在派生類中重定義基類的虛函數(shù)來實(shí)現(xiàn),使程序員在設(shè)計(jì)程序時(shí)可以對(duì)問題進(jìn)行更好的抽象,易設(shè)計(jì)出重用性和維護(hù)性俱佳的程序。
(2)舉例
如下例(C++程序),如果A是基類,B和C是A的派生類,基類中多態(tài)函數(shù)Test的參數(shù)是A的指針。則Test函數(shù)可以引用A、B、C的對(duì)象如下:
4.注意
(1)面向?qū)ο筌浖?dú)有的多態(tài)、繼承、封裝等新特點(diǎn),使OO程序設(shè)計(jì)比傳統(tǒng)語言程序設(shè)計(jì)產(chǎn)生錯(cuò)誤的可能性更大,使得傳統(tǒng)軟件測(cè)試中的重點(diǎn)不再顯得那么突出,也使原來測(cè)試經(jīng)驗(yàn)和實(shí)踐證明的次要方面成為主要問題。例如,在傳統(tǒng)的面向過程程序中,對(duì)于函數(shù)y=Func(x);你只需要考慮一個(gè)函數(shù)“Func()”的行為特點(diǎn),而在面向?qū)ο蟪绦蛑校悴坏貌煌瑫r(shí)考慮基類函數(shù)“Base::Func()”的行為和繼承類函數(shù)“Derived::Func()”的行為。
(2)面向?qū)ο蟪绦虻慕Y(jié)構(gòu)不再是傳統(tǒng)的功能模塊結(jié)構(gòu)。作為一個(gè)整體,不能再用原有集成測(cè)試所要求的逐步將開發(fā)的模塊搭建在一起進(jìn)行測(cè)試的方法。而且,面向?qū)ο筌浖?duì)各開發(fā)階段都有不同于以往的要求和結(jié)果,已經(jīng)不可能用功能細(xì)化的觀點(diǎn)來檢測(cè)面向?qū)ο蠓治龊驮O(shè)計(jì)的結(jié)果了。故傳統(tǒng)的測(cè)試模型對(duì)面向?qū)ο筌浖呀?jīng)不再適用。于是產(chǎn)生了面向?qū)ο鬁y(cè)試模型。
7.3 面向?qū)ο鬁y(cè)試模型
面向?qū)ο蟮拈_發(fā)模型突破了傳統(tǒng)的瀑布模型,面向?qū)ο蟮拈_發(fā)模型將開發(fā)分為面向?qū)ο蠓治觯∣OA),面向?qū)ο笤O(shè)計(jì)(OOD)和面向?qū)ο缶幊蹋∣OP)三個(gè)階段。針對(duì)該開發(fā)模型,結(jié)合傳統(tǒng)的測(cè)試步驟的劃分,把面向?qū)ο蟮能浖y(cè)試分為:面向?qū)ο蠓治龅臏y(cè)試、面向?qū)ο笤O(shè)計(jì)的測(cè)試、面向?qū)ο缶幊痰臏y(cè)試、面向?qū)ο髥卧獪y(cè)試、面向?qū)ο蠹蓽y(cè)試、面向?qū)ο蟠_認(rèn)和系統(tǒng)測(cè)試。它是一種整個(gè)軟件開發(fā)過程中不斷測(cè)試的測(cè)試模型,使開發(fā)階段的測(cè)試與編碼完成后的單元測(cè)試、集成測(cè)試、系統(tǒng)測(cè)試成為一個(gè)整體。測(cè)試模型如圖7-1所示。
圖7-1 面向?qū)ο鬁y(cè)試模型
OOA Test和OOD Test是對(duì)分析結(jié)果和設(shè)計(jì)結(jié)果的測(cè)試,主要是對(duì)分析設(shè)計(jì)產(chǎn)生的文本進(jìn)行的,是軟件開發(fā)前期的關(guān)鍵性測(cè)試。
OOP Test主要針對(duì)編程風(fēng)格和程序代碼實(shí)現(xiàn)進(jìn)行測(cè)試,其主要的測(cè)試內(nèi)容體現(xiàn)在以下兩方面:
一、面向?qū)ο髥卧獪y(cè)試
面向?qū)ο髥卧獪y(cè)試對(duì)程序內(nèi)部具體單一的功能模塊的測(cè)試,主要是對(duì)類成員函數(shù)的測(cè)試,是進(jìn)行面向?qū)ο蠹蓽y(cè)試的基礎(chǔ)。
二、面向?qū)ο蠹蓽y(cè)試
面向?qū)ο蠹蓽y(cè)試主要對(duì)系統(tǒng)內(nèi)部的相互服務(wù)進(jìn)行測(cè)試,如成員函數(shù)間的相互作用,類間的消息傳遞等。不但要基于面向?qū)ο髥卧獪y(cè)試,更要參考OOD或OOD Test結(jié)果。確認(rèn)和系統(tǒng)測(cè)試是基于面向?qū)ο蠹蓽y(cè)試的最后階段的測(cè)試,主要以用戶需求為測(cè)試標(biāo)準(zhǔn),需要借鑒OOA或OOA Test的結(jié)果。
盡管上述各階段測(cè)試構(gòu)成一個(gè)相互作用的整體,但其測(cè)試的主體、方向和方法各有不同。
7.4 面向?qū)ο筌浖臏y(cè)試策略
一、面向?qū)ο蠓治觯∣OA)的測(cè)試
1.概述
(1)定義
傳統(tǒng)的面向過程分析是一個(gè)功能分解的過程,是一個(gè)把系統(tǒng)看成可以分解的功能的集合,面向?qū)ο蠓治觯∣OA)則大不同與傳統(tǒng)的面向過程分析,它是把E—R圖和語義網(wǎng)絡(luò)模型,即信息造型中的概念,與面向?qū)ο蟪绦蛟O(shè)計(jì)語言中的重要概念結(jié)合在一起而形成的分析方法。
(2)測(cè)試重點(diǎn)
OOA直接映射問題空間,全面地將問題空間中實(shí)現(xiàn)功能的現(xiàn)實(shí)抽象化。將問題空間中的實(shí)例抽象為對(duì)象(不同于C++中對(duì)象的概念),用對(duì)象的結(jié)構(gòu)反映問題空間的復(fù)雜實(shí)例和復(fù)雜關(guān)系,用屬性和服務(wù)表示實(shí)例的特性和行為。對(duì)OOA測(cè)試重點(diǎn)在于它的完整性和冗余性,原因如下:
①完整性:OOA的結(jié)果是為后面階段類的選定和實(shí)現(xiàn),類層次結(jié)構(gòu)的組織和實(shí)現(xiàn)做準(zhǔn)備。OOA對(duì)問題空間的分析抽象不完整,最終會(huì)影響軟件的功能實(shí)現(xiàn),會(huì)導(dǎo)致軟件開發(fā)后期產(chǎn)生大量原本可避免的修補(bǔ)工作。
②冗余性:一些冗余的對(duì)象或結(jié)構(gòu)會(huì)影響類的選定、程序的整體結(jié)構(gòu)或增加程序員不必要的工作量。
(3)OOA階段的測(cè)試的劃分
OOA的測(cè)試是一個(gè)不可分割的系統(tǒng)過程,為敘述的方便,鑒于Coad方法所提出的OOA實(shí)現(xiàn)步驟,對(duì)OOA階段的測(cè)試劃分為以下五個(gè)方面:
①對(duì)認(rèn)定的對(duì)象的測(cè)試;
②對(duì)認(rèn)定的結(jié)構(gòu)的測(cè)試;
③對(duì)認(rèn)定的主題的測(cè)試;
④對(duì)定義的屬性和實(shí)例關(guān)聯(lián)的測(cè)試;
⑤對(duì)定義的服務(wù)和消息關(guān)聯(lián)的測(cè)試。
2.對(duì)認(rèn)定的對(duì)象的測(cè)試
OOA中認(rèn)定的對(duì)象是對(duì)問題空間中的結(jié)構(gòu),其他系統(tǒng)、設(shè)備,被記憶的事件,系統(tǒng)涉及的人員等實(shí)際實(shí)例的抽象。對(duì)其測(cè)試可以從以下幾個(gè)方面考慮:
(1)認(rèn)定的對(duì)象是否全面,問題空間中所有涉及到的實(shí)例是否都反映在認(rèn)定的抽象對(duì)象中;
(2)認(rèn)定的對(duì)象是否具有多個(gè)屬性,只有一個(gè)屬性的對(duì)象通常應(yīng)看成其他對(duì)象的屬性,而不是抽象為獨(dú)立的對(duì)象;
(3)對(duì)認(rèn)定為同一對(duì)象的實(shí)例是否有共同的、區(qū)別于其他實(shí)例的共同屬性;
(4)對(duì)認(rèn)定為同一對(duì)象的實(shí)例是否提供或需要相同的服務(wù)。如果服務(wù)隨著實(shí)例的不同而變化,認(rèn)定的對(duì)象就需要分解或利用繼承性來分類表示;
(5)如果系統(tǒng)沒有必要始終保持對(duì)象代表的實(shí)例的信息,提供或者得到關(guān)于其服務(wù)、認(rèn)定的對(duì)象也無必要;
(6)認(rèn)定的對(duì)象的名稱應(yīng)該盡量準(zhǔn)確、適用。
3.對(duì)認(rèn)定的結(jié)構(gòu)的測(cè)試
在Coad方法中,認(rèn)定的結(jié)構(gòu)指的是多種對(duì)象的組織方式,用來反映問題空間中的復(fù)雜實(shí)例和復(fù)雜關(guān)系。該結(jié)構(gòu)分為以下兩種:
(1)分類結(jié)構(gòu)
分類結(jié)構(gòu)體現(xiàn)了問題空間中的實(shí)例一般與特殊的關(guān)系,對(duì)認(rèn)定的分類結(jié)構(gòu)的測(cè)試可從以下幾個(gè)方面著手:
①對(duì)于結(jié)構(gòu)中的一種對(duì)象,尤其是處于高層的對(duì)象,是否在問題空間中含有不同于下一層對(duì)象的特殊的可能性,即是否能派生出下一層對(duì)象;
②對(duì)于結(jié)構(gòu)中的一種對(duì)象,尤其是處于同一低層的對(duì)象,是否能抽象出在現(xiàn)實(shí)中有意義的更一般的上層對(duì)象;
③對(duì)所有認(rèn)定的對(duì)象,是否能在問題空間內(nèi)向上層抽象出在現(xiàn)實(shí)中有意義的對(duì)象;
④高層的對(duì)象的特性是否完全體現(xiàn)下層的共性;
⑤低層的對(duì)象是否在高層特性基礎(chǔ)上有其特殊性。
(2)組裝結(jié)構(gòu)
組裝結(jié)構(gòu)體現(xiàn)了問題空間中實(shí)例整體與局部的關(guān)系。對(duì)認(rèn)定的組裝結(jié)構(gòu)的測(cè)試從以下幾個(gè)方面入手:
①整體(對(duì)象)和部件(對(duì)象)的組裝關(guān)系是否符合現(xiàn)實(shí)的關(guān)系;
②整體(對(duì)象)的部件(對(duì)象)是否在考慮的問題空間中有實(shí)際應(yīng)用;
③整體(對(duì)象)中是否遺漏了在問題空間中有用的部件(對(duì)象);
④部件(對(duì)象)是否能夠在問題空間中組裝新的有現(xiàn)實(shí)意義的整體(對(duì)象)。
4.對(duì)認(rèn)定的主題的測(cè)試
主題是在對(duì)象和結(jié)構(gòu)的基礎(chǔ)上更高一層的抽象。為了提供OOA分析結(jié)果的可見性,對(duì)主題層的測(cè)試應(yīng)該考慮以下幾個(gè)方面:
(1)貫徹George Miller的“7+2”原則(George Miller指出普通人的短期記憶的能量,是7加2或減2,即5與9之間)。如果主題個(gè)數(shù)超過7個(gè),就要求對(duì)有較密切屬性和服務(wù)的主題進(jìn)行歸并;
(2)主題所反映的一組對(duì)象和結(jié)構(gòu)是否具有相同和相近的屬性和服務(wù);
(3)認(rèn)定的主題是否是對(duì)象和結(jié)構(gòu)更高層的抽象,是否便于理解OOA結(jié)果的概貌(尤其是對(duì)非技術(shù)人員的OOA結(jié)果讀者);
(4)主題間的消息聯(lián)系(抽象)是否代表主題所反映的對(duì)象和結(jié)構(gòu)之間的所有關(guān)聯(lián)。
5.對(duì)定義的屬性和實(shí)例關(guān)聯(lián)的測(cè)試
屬性是用來描述對(duì)象或結(jié)構(gòu)所反映的實(shí)例的特性的,而實(shí)例關(guān)聯(lián)是反映實(shí)例集合間的映射關(guān)系。對(duì)屬性和實(shí)例關(guān)聯(lián)的測(cè)試從以下幾個(gè)方面考慮:
(1)定義的屬性是否適用于相應(yīng)的對(duì)象和分類結(jié)構(gòu)的各現(xiàn)實(shí)實(shí)例;
(2)定義的屬性在現(xiàn)實(shí)世界是否與該實(shí)例關(guān)系密切;
(3)定義的屬性在問題空間是否與該實(shí)例關(guān)系密切;
(4)定義的屬性是否能不依賴于其他屬性被獨(dú)立理解;
(5)定義的屬性在分類結(jié)構(gòu)中的位置是否恰當(dāng)以及低層對(duì)象的共有屬性是否在上層對(duì)象的屬性中體現(xiàn);
(6)在問題空間中各對(duì)象的屬性是否定義完整;
(7)定義的實(shí)例關(guān)聯(lián)是否符合現(xiàn)實(shí);
(8)在問題空間中實(shí)例關(guān)聯(lián)是否定義完整,特別需要注意“一對(duì)多”和“多對(duì)多”的實(shí)例關(guān)聯(lián)。
6.對(duì)定義的服務(wù)和消息關(guān)聯(lián)的測(cè)試
定義的服務(wù),即定義的每一種對(duì)象和結(jié)構(gòu)在問題空間所要求的行為。由于問題空間中實(shí)例間必要的通信,在OOA中需要相應(yīng)地定義消息關(guān)聯(lián)。對(duì)定義的服務(wù)和消息關(guān)聯(lián)的測(cè)試從如下方面進(jìn)行:
(1)對(duì)象和結(jié)構(gòu)在問題空間的不同狀態(tài)下是否定義了相應(yīng)的服務(wù);
(2)對(duì)象或結(jié)構(gòu)所需要的服務(wù)是否都定義了相應(yīng)的消息關(guān)聯(lián);
(3)定義的消息關(guān)聯(lián)所指引的服務(wù)提供是否正確;
(4)沿著消息關(guān)聯(lián)執(zhí)行的線程是否合理,是否符合現(xiàn)實(shí)過程;
(5)定義的服務(wù)是否重復(fù),是否定義了能夠得到的服務(wù)。
二、面向?qū)ο笤O(shè)計(jì)(OOD)的測(cè)試
1.概述
在以往結(jié)構(gòu)化的設(shè)計(jì)方法,用的“是面向作業(yè)的設(shè)計(jì)方法,它把系統(tǒng)分解以后,提出一組作業(yè),這些作業(yè)是以過程實(shí)現(xiàn)系統(tǒng)的基礎(chǔ)構(gòu)造,把問題域的分析轉(zhuǎn)化為求解域的設(shè)計(jì),分析的結(jié)果是設(shè)計(jì)階段的輸入”。
面向?qū)ο笤O(shè)計(jì)(OOD)采用“造型的觀點(diǎn)”,以O(shè)OA為基礎(chǔ)歸納類,并建立類結(jié)構(gòu)或進(jìn)一步構(gòu)造成類庫,以實(shí)現(xiàn)分析結(jié)果對(duì)問題空間的抽象。
2.特點(diǎn)
(1)概述
OOD歸納的類可以是對(duì)象簡(jiǎn)單的延續(xù),也可以是不同對(duì)象的相同或相似的服務(wù)。OOD是OOA的進(jìn)一步細(xì)化和更高層的抽象,它們的界限一般很難嚴(yán)格區(qū)分。
OOD確定類和類結(jié)構(gòu)不僅滿足當(dāng)前需求分析的要求,而且通過重新組合或加以適當(dāng)?shù)难a(bǔ)充,能方便實(shí)現(xiàn)功能的重用和擴(kuò)增,以不斷適應(yīng)用戶的要求。故對(duì)OOD的測(cè)試,建議針對(duì)功能的實(shí)現(xiàn)和重用以及對(duì)OOA結(jié)果的拓展,從以下三方面考慮:
①對(duì)認(rèn)定的類的測(cè)試;
②對(duì)構(gòu)造的類層次結(jié)構(gòu)的測(cè)試。
③對(duì)類庫的支持的測(cè)試。
(2)對(duì)認(rèn)定的類的測(cè)試
OOD認(rèn)定的類可以是OOA中認(rèn)定的對(duì)象,也可以是對(duì)象所需要的服務(wù)的抽象,對(duì)象所具有的屬性的抽象。認(rèn)定的類原則上應(yīng)該盡量具有基礎(chǔ)性,才便于維護(hù)和重用。主要包括以下幾個(gè)方面:
①是否涵蓋OOA中所有認(rèn)定的對(duì)象;
②是否能體現(xiàn)OOA中定義的屬性;
③是否能實(shí)現(xiàn)OOA中定義的服務(wù);
④是否對(duì)應(yīng)著一個(gè)含義明確的數(shù)據(jù)抽象;
⑤是否盡可能少地依賴其他類;
⑥類中的方法(在C++中即類的成員函數(shù))是否是單用途。
(3)對(duì)構(gòu)造的類層次結(jié)構(gòu)的測(cè)試
為能充分發(fā)揮面向?qū)ο蟮睦^承共享特性,OOD的類層次結(jié)構(gòu),通常基于OOA中產(chǎn)生的分類結(jié)構(gòu)的原則來組織,著重體現(xiàn)父類和子類間的一般性和特殊性。當(dāng)前問題空間,對(duì)類層次結(jié)構(gòu)的主要要求是能了解空間構(gòu)造實(shí)現(xiàn)全部功能的結(jié)構(gòu)框架。故需要測(cè)試以下幾個(gè)方面:
①類層次結(jié)構(gòu)是否涵蓋了所有定義的類;
②是否能體現(xiàn)OOA中所定義的實(shí)例關(guān)聯(lián);
③是否能實(shí)現(xiàn)OOA中所定義的消息關(guān)聯(lián);
④子類是否具有父類沒有的新特性;
⑤子類間的共同特性是否完全在父類中得以體現(xiàn)。
(4)對(duì)類庫支持的測(cè)試
對(duì)類庫的支持雖然也屬于類層次結(jié)構(gòu)的組織問題,但其強(qiáng)調(diào)的重點(diǎn)是軟件再次開發(fā)的重用。由于并不直接影響當(dāng)前軟件的開發(fā)和功能實(shí)現(xiàn),將其單獨(dú)提出來測(cè)試,也可作為對(duì)高質(zhì)量類層次結(jié)構(gòu)的評(píng)估。
①擬定測(cè)試點(diǎn)
a.一組子類中關(guān)于某種含義相同或基本相同的操作,是否有相同的接口(包括名字和參數(shù)表);
b.類中方法(在C++中即類的成員函數(shù))的功能是否較單純,相應(yīng)的代碼行是否較少(建議為不超過30行);
c.類的層次結(jié)構(gòu)是否深度大、寬度小。
因?yàn)镺OA、OOD階段所建立的分析和設(shè)計(jì)模型不能進(jìn)行傳統(tǒng)意義上的測(cè)試,故不能被執(zhí)行,所以在每次迭代之后,一定要進(jìn)行評(píng)審。評(píng)審主要針對(duì)正確性和一致性方面。
在正確性方面,OO開發(fā)模式為演化(重復(fù)迭代)性質(zhì),即系統(tǒng)的初期為非形式化表示,以后發(fā)展為類的細(xì)節(jié)模型、類的連接和關(guān)聯(lián),系統(tǒng)設(shè)計(jì)和配置,以及對(duì)類的設(shè)計(jì)。每階段都要進(jìn)行評(píng)審。
正確性主要在于分析和設(shè)計(jì)模型表示所使用的符號(hào)語法是否正確,語義是否正確,以及類的關(guān)聯(lián)(實(shí)例間的聯(lián)系)是否正確地反映了真實(shí)世界對(duì)象間的關(guān)聯(lián)。
在一致性方面,由于演化性質(zhì),OOA和OOD模型(包括分析、設(shè)計(jì)和編碼層次,即類、屬性、操作、消息)不僅要正確,而且要一致。一致性可以用模型內(nèi)各實(shí)體間的關(guān)聯(lián)性來判斷。為評(píng)估一致性,應(yīng)檢查每個(gè)類及其與其他類的連接。可運(yùn)用類——責(zé)任——協(xié)作者(CRC)模型和對(duì)象——關(guān)系圖。
CRC模型由CRC索引卡片構(gòu)成,各CRC卡片列出類名、類的責(zé)任(操作)、以及其協(xié)作者類,類向其發(fā)送消息并依賴其完成自己的責(zé)任。協(xié)作包含在OO系統(tǒng)的類之間的一系列關(guān)系(即連接),對(duì)象關(guān)系模型提供了類之間連接的圖形表示。所有這些信息可以從OOA模型得到。
②評(píng)估類模型推薦采用的步驟
a.再次考察CRC模型和對(duì)象——關(guān)系模型,進(jìn)行交叉檢查,以保證由OOA模型所蘊(yùn)含的協(xié)作適當(dāng)?shù)胤磻?yīng)在二者中;
b.檢查各CRC索引卡片的描述,以確定某被授權(quán)的責(zé)任是否是協(xié)作者定義的一部分,例如,某個(gè)POS結(jié)賬系統(tǒng)定義的類,稱為credit sale,該類的CRC卡片如圖7-2所示。
圖7-2 一個(gè)用于復(fù)審的CRC卡片例子
對(duì)于這組類和協(xié)作,如果某責(zé)任被委托給指定的協(xié)作者(credit card),該責(zé)任是否將被完成,即類credit card是否具有一個(gè)操作,使得其可以被讀。本例的情形是是。遍歷對(duì)象關(guān)系,以保證所有這樣的連接有效;
c.反轉(zhuǎn)該連接,以保證各被請(qǐng)求服務(wù)的協(xié)作者正在接收來自合理源的請(qǐng)求;
d.使用在c步檢查的反轉(zhuǎn)連接,確定是否可能需要其他的類,或責(zé)任是否被合適地在類間分組;
e.確定被廣泛請(qǐng)求的責(zé)任是否可被組合為單個(gè)的責(zé)任,例如,read credit card和get authorization在每種情況中均發(fā)生,可以被組合為validate credit。request責(zé)任,結(jié)合了獲取信用卡號(hào)及獲得授權(quán);
f.步驟a~e被迭代地應(yīng)用到各類,并貫穿于OOA模型的每次演化過程中。一旦已經(jīng)創(chuàng)建了設(shè)計(jì)模型,也應(yīng)該進(jìn)行對(duì)系統(tǒng)設(shè)計(jì)和對(duì)象設(shè)計(jì)的復(fù)審。
系統(tǒng)設(shè)計(jì)描述了構(gòu)成產(chǎn)品的子系統(tǒng)、子系統(tǒng)被分配到處理器的方式,以及類到子系統(tǒng)的分配。對(duì)象模型表示各類的細(xì)節(jié)和實(shí)現(xiàn)類間的協(xié)作所必須的消息序列活動(dòng)。
通過檢查在OOA階段開發(fā)的對(duì)象——行為模型,映射需要的系統(tǒng)行為和被設(shè)計(jì)用于完成該行為的子系統(tǒng)來進(jìn)行系統(tǒng)設(shè)計(jì)的復(fù)審,也在系統(tǒng)行為的語境內(nèi)復(fù)審并發(fā)性和任務(wù)分配,評(píng)估系統(tǒng)的行為狀態(tài)以確定哪些行為并發(fā)地存在。
對(duì)象模型應(yīng)該針對(duì)對(duì)象——關(guān)系網(wǎng)絡(luò)來測(cè)試,以保證所有設(shè)計(jì)對(duì)象包含為實(shí)現(xiàn)每張CRC索引卡片定義的協(xié)作所必須的屬性和操作。
三、面向?qū)ο缶幊蹋∣OP)的測(cè)試
1.簡(jiǎn)介
面向?qū)ο蟪绦蛩哂械睦^承、封裝和多態(tài)的新特性,使得傳統(tǒng)的測(cè)試策略不再完全適。
封裝是對(duì)數(shù)據(jù)的隱藏,外界只能通過被提供的操作來訪問或修改數(shù)據(jù),這樣降低了數(shù)據(jù)被任意修改和讀寫的可能性,降低了傳統(tǒng)程序中對(duì)數(shù)據(jù)非法操作的測(cè)試;繼承是面向?qū)ο蟪绦虻闹匾攸c(diǎn),繼承使得代碼的重用率提高,同時(shí)也使錯(cuò)誤傳播的概率提高;多態(tài)使得面向?qū)ο蟪绦驅(qū)ν獬尸F(xiàn)出強(qiáng)大的處理能力,但同時(shí)卻使得程序內(nèi)“同一”函數(shù)的行為復(fù)雜化,測(cè)試時(shí)不得不考慮不同類型具體執(zhí)行的代碼和產(chǎn)生的行為;
在面向?qū)ο缶幊蹋∣OP)階段,忽略類功能實(shí)現(xiàn)的細(xì)則,將測(cè)試集中在類功能的實(shí)現(xiàn)和相應(yīng)的面向?qū)ο蟪绦蝻L(fēng)格上,主要體現(xiàn)為以下兩個(gè)方面(假設(shè)編程使用C++語言):
(1)數(shù)據(jù)成員是否滿足數(shù)據(jù)封裝的要求;
(2)類是否實(shí)現(xiàn)了要求的功能。
2.?dāng)?shù)據(jù)成員是否滿足數(shù)據(jù)封裝的要求
數(shù)據(jù)封裝是數(shù)據(jù)和數(shù)據(jù)有關(guān)的操作的集合。檢查數(shù)據(jù)成員是否滿足數(shù)據(jù)封裝的要求,基本原則是數(shù)據(jù)成員是否被外界(數(shù)據(jù)成員所屬的類或子類以外的調(diào)用)直接調(diào)用。即當(dāng)改變數(shù)據(jù)成員的結(jié)構(gòu)時(shí),是否影響類的對(duì)外接口,是否會(huì)導(dǎo)致相應(yīng)的外界必須改動(dòng)。
注意,有時(shí)強(qiáng)制的類型轉(zhuǎn)換會(huì)破壞數(shù)據(jù)的封裝特性。例如:
在上面的程序段中,xx的私有數(shù)據(jù)成員a和b可以通過yy被隨意訪問。
3.類是否實(shí)現(xiàn)要求的功能
類所實(shí)現(xiàn)的功能都是通過類的成員函數(shù)執(zhí)行的,應(yīng)首先保證類成員函數(shù)的正確性,單獨(dú)地看待類的成員函數(shù),幾乎所有傳統(tǒng)的單元測(cè)試中所使用的方法,都可在面向?qū)ο蟮膯卧獪y(cè)試中使用。類函數(shù)成員的正確行為是類能夠?qū)崿F(xiàn)要求的功能的基礎(chǔ),類成員函數(shù)間的作用和類之間的服務(wù)調(diào)用是單元測(cè)試無法確定的。因此,需要進(jìn)行面向?qū)ο蟮募蓽y(cè)試。測(cè)試類的功能,應(yīng)該以所做的OOD結(jié)果為依據(jù),檢測(cè)類提供的功能是否滿足設(shè)計(jì)的要求。必要時(shí)還應(yīng)該參照OOA的結(jié)果,以之為最終標(biāo)準(zhǔn)。
四、面向?qū)ο筌浖膯卧獪y(cè)試
傳統(tǒng)的單元測(cè)試是針對(duì)程序的函數(shù)、過程或完成某一特定功能的程序塊,可沿用單元測(cè)試的概念,來實(shí)際測(cè)試類成員函數(shù)。一些傳統(tǒng)的測(cè)試方法在面向?qū)ο蟮膯卧獪y(cè)試中都可以使用。單元測(cè)試一般建議由程序員完成。用于單元級(jí)測(cè)試的測(cè)試分析(提出相應(yīng)的測(cè)試要求)和測(cè)試用例(選擇適當(dāng)?shù)妮斎耄_(dá)到測(cè)試要求),規(guī)模和難度等均遠(yuǎn)小于后面介紹的對(duì)整個(gè)系統(tǒng)的測(cè)試分析和測(cè)試用例,而且強(qiáng)調(diào)對(duì)語句應(yīng)該有100%的代碼執(zhí)行覆蓋率。
1.兩個(gè)假設(shè)
在設(shè)計(jì)測(cè)試用例選擇輸入數(shù)據(jù)時(shí),可基于以下兩個(gè)假設(shè)(假設(shè)使用C++編程語言):
(1)如果函數(shù)(程序)對(duì)某一類輸入中的一個(gè)數(shù)據(jù)能正確執(zhí)行,對(duì)同類中的其他輸入也能正確執(zhí)行;
(2)如果函數(shù)(程序)對(duì)某一復(fù)雜度的輸入能正確執(zhí)行,對(duì)更高復(fù)雜度的輸入也能正確執(zhí)行。例如,需要選擇字符串作為輸入時(shí),基于本假設(shè),就無須計(jì)較字符串的長(zhǎng)度。除非字符串的長(zhǎng)度是要求固定的,如IP地址字符串。
在面向?qū)ο蟪绦蛑校惓蓡T函數(shù)通常都很小,功能單一,函數(shù)之間調(diào)用頻繁,容易出現(xiàn)一些不宜發(fā)現(xiàn)的錯(cuò)誤。例如:
if(-1==write(fid,buffer,amount))error_out();
該語句沒有全面檢查write()的返回值,無意中只斷然假設(shè)了數(shù)據(jù)被完全寫入和沒有寫入兩種情況。當(dāng)測(cè)試也忽略了數(shù)據(jù)部分的寫入情況時(shí),就給程序遺留了隱患,建議加入else語句。
①按程序的設(shè)計(jì),使用函數(shù)strrchr()查找最后的匹配字符,但錯(cuò)誤程序中寫成了函數(shù)strchr(),使程序功能實(shí)現(xiàn)時(shí)查找的是第一個(gè)匹配字符;
②程序中將if(strncmp(str1,str2,strlen(str1)))誤寫成了if(strncmp(str1,str2,strlen(str2)))。如果測(cè)試用例中使用的數(shù)據(jù)str1和str2長(zhǎng)度一樣,就無法檢測(cè)出來。因此,在做測(cè)試分析和測(cè)試用例設(shè)計(jì)時(shí),應(yīng)該注意面向?qū)ο蟪绦虻奶攸c(diǎn),仔細(xì)地進(jìn)行測(cè)試分析和設(shè)計(jì)測(cè)試用例,尤其是針對(duì)以函數(shù)返回值作為條件判斷的選擇、字符串操作等情況。
2.兩方面考慮
面向?qū)ο缶幊痰奶匦允沟脤?duì)成員函數(shù)的測(cè)試,不完全等同于傳統(tǒng)的函數(shù)或過程測(cè)試。尤其是繼承特性和多態(tài)特性,使子類繼承或過載的父類成員函數(shù)出現(xiàn)了傳統(tǒng)測(cè)試中未遇見的問題。Brian Marick給出了兩方面的考慮如下:
(1)繼承的成員函數(shù)是否都不需要測(cè)試
對(duì)父類中已經(jīng)測(cè)試過的成員函數(shù),有以下兩種情況需要在子類中重新測(cè)試:
①繼承的成員函數(shù)在子類中做了改動(dòng);
②成員函數(shù)調(diào)用了改動(dòng)過的成員函數(shù)的一部分。
例如:假設(shè)父類Bass有兩個(gè)成員函數(shù):Inherited()和Redefined(),子類Derived只對(duì)Redefined()做了改動(dòng)。Derived::Redefined()顯然需要重新測(cè)試。對(duì)于Derived::Inherited(),如果它有調(diào)用Redefined()的語句(如:x=xfRedefined()),就需要重新測(cè)試,反之,無此必要。
(2)對(duì)父類的測(cè)試是否能照搬到子類
延用上面的假設(shè),Base::Redefined()和Derived::Redefined()已經(jīng)是不同的成員函數(shù),其有不同的服務(wù)說明和執(zhí)行。對(duì)此,照理應(yīng)該對(duì)Derived::Redefined()重新進(jìn)行測(cè)試分析,設(shè)計(jì)測(cè)試用例。但由于面向?qū)ο蟮睦^承使得兩個(gè)函數(shù)有相似之處,故只需在Base::Redefined()的測(cè)試要求和測(cè)試用例上添加對(duì)Derived::Redfined()新的測(cè)試要求和增補(bǔ)相應(yīng)的測(cè)試用例。例如:Base::Redefined()函數(shù)中含有如下語句:
在原有的測(cè)試上,對(duì)Derived::Redfined()的測(cè)試只需做如下改動(dòng):將value==0的測(cè)試結(jié)果期望改動(dòng);增加value==99的測(cè)試。
3.多態(tài)的不同形式
多態(tài)有幾種不同的形式,如參數(shù)多態(tài)、包含多態(tài)、過載多態(tài)。包含多態(tài)和過載多態(tài)在面向?qū)ο笳Z言中通常體現(xiàn)在子類與父類的繼承關(guān)系上。包含多態(tài)雖然使成員函數(shù)的參數(shù)可有多種類型,但通常只是增加測(cè)試的復(fù)雜度。對(duì)具有包含多態(tài)的成員函數(shù)進(jìn)行測(cè)試時(shí),只需要在原有的測(cè)試分析和基礎(chǔ)上增加對(duì)測(cè)試用例中輸入數(shù)據(jù)的類型的考慮即可。
五、面向?qū)ο筌浖募蓽y(cè)試
因?yàn)槊嫦驅(qū)ο筌浖]有層次的控制結(jié)構(gòu),傳統(tǒng)的自頂向下和自底向上集成策略就沒有意義,而且,一次集成一個(gè)操作到類中(傳統(tǒng)的增量集成方法)經(jīng)常是不可能的。此外,傳統(tǒng)的自底向上通過集成完成的功能模塊測(cè)試,一般可以在部分程序編譯完成的情況下進(jìn)行。
1.簡(jiǎn)介
面向?qū)ο蟮募蓽y(cè)試通常需要在整個(gè)程序編譯完成后進(jìn)行。此外,面向?qū)ο蟪绦蚓哂袆?dòng)態(tài)特性,程序的控制流往往無法確定,故只能對(duì)整個(gè)編譯后的程序做基于黑盒子的集成測(cè)試。
2.對(duì)OO軟件的集成測(cè)試的策略
(1)基于線程的測(cè)試(threadbased testing)
集成對(duì)回應(yīng)系統(tǒng)的一個(gè)輸入或事件所需的一組類,各線程被集成并分別測(cè)試,應(yīng)用回歸測(cè)試以保證沒有產(chǎn)生副作用。
(2)基于使用的測(cè)試(use based testing)
通過測(cè)試那些幾乎不使用服務(wù)器類的類(稱為獨(dú)立類)而開始構(gòu)造系統(tǒng),在獨(dú)立類測(cè)試完成后,下一層中使用獨(dú)立類的類(稱為依賴類)被測(cè)試。該依賴類層次的測(cè)試序列一直持續(xù)到構(gòu)造出完整一個(gè)系統(tǒng)。序列和傳統(tǒng)集成不同,要盡可能避免使用驅(qū)動(dòng)器和樁(stubs)作為替代操作。
3.面向?qū)ο蟮募蓽y(cè)試的步驟
面向?qū)ο蟮募蓽y(cè)試能夠檢測(cè)出相對(duì)獨(dú)立的,單元測(cè)試無法檢測(cè)出,那些類相互作用時(shí)才會(huì)產(chǎn)生的錯(cuò)誤。面向?qū)ο蟮募蓽y(cè)試可以分成以下兩步進(jìn)行:
(1)靜態(tài)測(cè)試
靜態(tài)測(cè)試主要針對(duì)程序的結(jié)構(gòu)進(jìn)行,檢測(cè)程序結(jié)構(gòu)是否符合設(shè)計(jì)要求。現(xiàn)在流行的一些測(cè)試軟件都能提供一種稱為“可逆性工程”的功能,即通過源程序得到類關(guān)系圖和函數(shù)功能調(diào)用關(guān)系圖,將“可逆性工程”得到的結(jié)果與OOD的結(jié)果相比較,檢測(cè)程序結(jié)構(gòu)和實(shí)現(xiàn)上是否有缺陷。即通過這種方法檢測(cè)OOP是否達(dá)到設(shè)計(jì)要求。
(2)動(dòng)態(tài)測(cè)試
動(dòng)態(tài)測(cè)試設(shè)計(jì)測(cè)試用例時(shí),通常需要上述的功能調(diào)用結(jié)構(gòu)圖、類關(guān)系圖或者實(shí)體關(guān)系圖為參考,確定不需要被重復(fù)測(cè)試的部分,從而優(yōu)化測(cè)試用例,減少測(cè)試工作量,使得進(jìn)行的測(cè)試能夠達(dá)到一定覆蓋標(biāo)準(zhǔn)。
①測(cè)試要達(dá)到的覆蓋標(biāo)準(zhǔn)
a.達(dá)到類所有的服務(wù)要求或服務(wù)提供的一定覆蓋率;
b.依據(jù)類間傳遞的消息,達(dá)到對(duì)所有執(zhí)行線程的一定覆蓋率;
c.達(dá)到類的所有狀態(tài)的一定覆蓋率;
d.可以考慮使用現(xiàn)有的一些測(cè)試工具來得到程序代碼執(zhí)行的覆蓋率。
②具體設(shè)計(jì)測(cè)試用例可參考的步驟
a.先選定檢測(cè)的類,參考OOD分析結(jié)果,仔細(xì)確定出類的狀態(tài)和相應(yīng)的行為,類或成員函數(shù)間傳遞的消息,輸入或輸出的界定等;
b.確定覆蓋標(biāo)準(zhǔn);
c.利用結(jié)構(gòu)關(guān)系圖確定待測(cè)類的所有關(guān)聯(lián);
d.根據(jù)程序中類的對(duì)象構(gòu)造測(cè)試用例,確認(rèn)使用何種輸入激發(fā)類的狀態(tài),使用類的服務(wù)和期望產(chǎn)生何種行為等。
注意:設(shè)計(jì)測(cè)試用例時(shí),不但要設(shè)計(jì)滿足類功能的輸入,還應(yīng)有意識(shí)地設(shè)計(jì)一些被禁止的例子,確認(rèn)類是否有不合法的行為產(chǎn)生,如發(fā)送與類狀態(tài)不相適應(yīng)的消息,要求不相適應(yīng)的服務(wù)等。根據(jù)具體情況,動(dòng)態(tài)的集成測(cè)試,有時(shí)也可通過系統(tǒng)測(cè)試完成。
六、面向?qū)ο筌浖拇_認(rèn)和系統(tǒng)測(cè)試
通過單元測(cè)試和集成測(cè)試,僅能保證軟件開發(fā)的功能得以實(shí)現(xiàn),但不能確認(rèn)在實(shí)際運(yùn)行時(shí),它是否能夠滿足用戶的需要,是否大量地存在著實(shí)際使用條件下會(huì)被誘發(fā)產(chǎn)生錯(cuò)誤的隱患。為此,對(duì)完成開發(fā)的軟件必須進(jìn)行規(guī)范的系統(tǒng)測(cè)試,即需要測(cè)試其與系統(tǒng)其他部分配套運(yùn)行的表現(xiàn),以確保在系統(tǒng)各部分協(xié)調(diào)工作的環(huán)境下軟件也能正常運(yùn)行。測(cè)試過程中,需要注意以下幾個(gè)方面:
(1)系統(tǒng)測(cè)試應(yīng)該盡量搭建與用戶實(shí)際使用環(huán)境相同的測(cè)試平臺(tái),應(yīng)該保證被測(cè)系統(tǒng)的完整性,對(duì)暫時(shí)沒有的系統(tǒng)設(shè)備部件,應(yīng)采取相應(yīng)的模擬手段。
(2)系統(tǒng)測(cè)試時(shí),應(yīng)該參考OOA分析的結(jié)果,對(duì)應(yīng)描述的對(duì)象、屬性和各種服務(wù),檢測(cè)軟件是否能夠完全“再現(xiàn)”問題空間。系統(tǒng)測(cè)試不僅是檢測(cè)軟件的整體行為表現(xiàn),也是對(duì)軟件開發(fā)設(shè)計(jì)的再確認(rèn)。
(3)在系統(tǒng)層次,類連接的細(xì)節(jié)消失了。OO軟件的有效性集中在用戶可見的動(dòng)作和用戶可識(shí)別的系統(tǒng)輸出上。為協(xié)助有效性測(cè)試的導(dǎo)出,測(cè)試人員應(yīng)該利用作為分析模型一部分的使用實(shí)例,使用實(shí)例提供在用戶交互需求中很可能發(fā)現(xiàn)錯(cuò)誤的一場(chǎng)景。
OO軟件確認(rèn)和系統(tǒng)測(cè)試具體的測(cè)試內(nèi)容與傳統(tǒng)系統(tǒng)測(cè)試基本相同,包括:功能測(cè)試、強(qiáng)度測(cè)試、性能測(cè)試、安全測(cè)試、恢復(fù)測(cè)試、易用性測(cè)試、安裝/卸載測(cè)試(install/uninstall test)等。
7.5 面向?qū)ο筌浖y(cè)試用例設(shè)計(jì)
一、簡(jiǎn)介
面向?qū)ο鬁y(cè)試關(guān)注于設(shè)計(jì)合適的操作序列以測(cè)試類的狀態(tài)。Berard提出了測(cè)試用例的設(shè)計(jì)方法,主要原則包括:
(1)對(duì)每個(gè)測(cè)試用例應(yīng)當(dāng)給予特殊的標(biāo)識(shí),并且還應(yīng)當(dāng)與測(cè)試的類有明確的聯(lián)系;
(2)測(cè)試目的應(yīng)當(dāng)明確;
(3)應(yīng)當(dāng)為每個(gè)測(cè)試用例開發(fā)一個(gè)測(cè)試步驟列表。
該列表應(yīng)包含以下內(nèi)容:
(1)列出所要測(cè)試的對(duì)象的專門說明;
(2)列出將要作為測(cè)試結(jié)果運(yùn)行的消息和操作;
(3)列出測(cè)試對(duì)象可能發(fā)生的例外情況;
(4)列出外部條件(即為了正確對(duì)軟件進(jìn)行測(cè)試所必須有的外部環(huán)境的變化);
(5)列出為了幫助理解和實(shí)現(xiàn)測(cè)試所需要的附加信息。
二、傳統(tǒng)測(cè)試用例設(shè)計(jì)方法的可用性
盡管OO軟件的局域性、封裝性、信息隱藏、繼承性和對(duì)象的抽象性等給測(cè)試用例設(shè)計(jì)帶來困難,但黑盒測(cè)試技術(shù)不僅適用于傳統(tǒng)軟件,也適用于OO軟件測(cè)試,use cases可以為黑盒及基于狀態(tài)的測(cè)試的設(shè)計(jì)提供有用的輸入。白盒測(cè)試用于OO軟件類的操作定義,基本路徑、循環(huán)測(cè)試或數(shù)據(jù)流技術(shù),可幫助保證已經(jīng)測(cè)試了操作中的每條語句。但OO軟件中許多類的操作結(jié)構(gòu)簡(jiǎn)單明了,故被認(rèn)為在類層上測(cè)試可能要比傳統(tǒng)軟件中的白盒測(cè)試方便。
三、基于故障的測(cè)試
1.簡(jiǎn)介
在OO軟件中,基于故障的測(cè)試具有較高的發(fā)現(xiàn)可能故障的能力。由于系統(tǒng)以滿足用戶的需求為目的,因此,基于故障的測(cè)試要從分析模型開始,考察可能發(fā)生的故障。為確定這些故障是否存在,可設(shè)計(jì)用例去執(zhí)行設(shè)計(jì)或代碼。
2.舉例
軟件開發(fā)人員經(jīng)常忽略問題的邊界,例如,當(dāng)測(cè)試Divide操作(該操作對(duì)負(fù)數(shù)和零返回錯(cuò)誤)時(shí),考慮邊界,“零本身”用于檢查程序員是否犯了如下錯(cuò)誤:
if(x>0)divide();
而不是正確的:
if(x>=0)divide();
3.特點(diǎn)
(1)該方法的有效性依賴于測(cè)試人員如何感覺“似乎可能的故障”,如果OO系統(tǒng)中的真實(shí)故障被感覺為“難以置信的”,則本方法實(shí)質(zhì)上不比任何隨機(jī)測(cè)試技術(shù)好,但如果可以從分析和設(shè)計(jì)模型進(jìn)行深入的檢查,則基于故障的測(cè)試則可以用相當(dāng)?shù)偷墓ぷ髁縼戆l(fā)現(xiàn)大量的錯(cuò)誤。
(2)基于故障測(cè)試可以用于集成測(cè)試,集成測(cè)試可以發(fā)現(xiàn)消息聯(lián)系中“可能的故障”。“可能的故障”一般為意料之外的結(jié)果、錯(cuò)誤地使用操作、不正確的引用等。為確定由操作(功能)引起的可能故障必須檢查操作的行為。
(3)該方法可用于操作測(cè)試,還可用于屬性測(cè)試,用以確定其對(duì)于不同類型的對(duì)象行為是否賦予了正確的屬性值,因?yàn)橐粋€(gè)對(duì)象的“屬性”由其賦予屬性的值定義。
注意:集成測(cè)試是從客戶對(duì)象(主動(dòng)),而不是從服務(wù)器對(duì)象(被動(dòng))上發(fā)現(xiàn)錯(cuò)誤。正如傳統(tǒng)的軟件集成測(cè)試是把注意力集中在調(diào)用代碼,而不是被調(diào)用代碼一樣,即發(fā)現(xiàn)客戶對(duì)象中“可能的故障”。
四、基于場(chǎng)景的測(cè)試
1.概述
(1)簡(jiǎn)介
基于場(chǎng)景的測(cè)試主要關(guān)注用戶需要做什么,而不是產(chǎn)品能做什么,即從用戶任務(wù)中找出用戶要做什么及如何去執(zhí)行。
該基于場(chǎng)景的測(cè)試有助于在一個(gè)單元測(cè)試情況下檢查多重系統(tǒng)。所以基于場(chǎng)景測(cè)試用例的測(cè)試比基于故障測(cè)試的更實(shí)際(接近用戶),而且更復(fù)雜一點(diǎn)。
(2)舉例
例子描述:考察一個(gè)OA軟件的基于場(chǎng)景測(cè)試的用例設(shè)計(jì)。
使用用例:確定最終設(shè)計(jì)。
背景:打印最終設(shè)計(jì),并能從預(yù)覽窗口中發(fā)現(xiàn)一些不易察覺的錯(cuò)誤。
其執(zhí)行事件序列:打印整個(gè)文件;對(duì)文件進(jìn)行剪切、復(fù)制、粘貼、移動(dòng)等修改操作;修改文件后,進(jìn)行文件預(yù)覽;進(jìn)行多頁預(yù)覽。
顯然,測(cè)試人員希望發(fā)現(xiàn)預(yù)覽和編輯這兩個(gè)軟件功能是否能夠相互依賴,否則就會(huì)產(chǎn)生錯(cuò)誤。
2.基于故障的測(cè)試減少的錯(cuò)誤類型
基于故障的測(cè)試減少了兩種主要類型的錯(cuò)誤:
(1)不正確的規(guī)格說明,如做了用戶不需要的功能,也可能缺少用戶需要的功能;
(2)沒有考慮子系統(tǒng)間的交互作用,如一個(gè)子系統(tǒng)(事件或數(shù)據(jù)流等)的建立,導(dǎo)致其他子系統(tǒng)的失敗。
五、OO類的隨機(jī)測(cè)試
1.定義
如果一個(gè)類有多個(gè)操作(功能),這些操作(功能)序列有多種排列。而不變化的操作序列可隨機(jī)產(chǎn)生,用這種可隨機(jī)排列的序列來檢查不同類實(shí)例的生存史,稱為隨機(jī)測(cè)試。
2.舉例
一個(gè)銀行信用卡的應(yīng)用,其中有一個(gè)類:賬戶(account)。該account的操作有open、setup、deposit、withdraw、balance、summarize、creditlimit和close。這些操作中的每項(xiàng)都可用于計(jì)算,但open、close必須在其他計(jì)算的任何一個(gè)操作前后執(zhí)行,即使open和close有該限制,這些操作仍有多種排列,所以一個(gè)不同變化的操作序列可由于應(yīng)用不同而隨機(jī)產(chǎn)生,如一個(gè)account實(shí)例的最小行為轉(zhuǎn)換期可包括以下操作:
open+setup+deposit+withdraw+close
對(duì)account的最小測(cè)試序列。在下面序列中可能發(fā)生大量的其他行為:
open+setup+deposit+[deposit|wi
由此可以隨機(jī)產(chǎn)生一系列不同的操作序列,例如:
測(cè)試用例1:
open+setup+deposit+deposit+balance+summarize+withdraw+close
測(cè)試用例2:open+setup+deposit+withdraw+deposit+balance+creditLimit+withdraw+close
可以執(zhí)行這些測(cè)試和其他的隨機(jī)順序測(cè)試,以測(cè)試不同的類實(shí)例生命歷史。
六、類層次的分割測(cè)試
該測(cè)試可減少用完全相同的方式檢查類測(cè)試用例的數(shù)目,類似傳統(tǒng)測(cè)試中的等價(jià)類劃分測(cè)試。分割測(cè)試可分為以下三種:
1.基于狀態(tài)的分割
按類操作是否改變類的狀態(tài)來進(jìn)行分割(歸類),仍用account類為例,改變狀態(tài)的操作有deposit、withdraw,不改變狀態(tài)的操作有balance、summarize、creditlimit。如果測(cè)試按檢查類操作是否改變類狀態(tài)來設(shè)計(jì),則結(jié)果如下:
[用例1]:執(zhí)行操作改變狀態(tài)
open+setup+deposit+deposit+withdraw+withdraw+close
[用例2]:執(zhí)行操作不改變狀態(tài)
open+setup+deposit+summarize+creditlimit+withdraw+close
2.基于屬性的分割
按類操作所用到的屬性來分割(歸類),仍以account類為例,其屬性creditlimit能被分割為三種操作:用creditlimit的操作,修改creditlimit的操作,不用也不修改creditlimit的操作。這樣,測(cè)試序列就可按每種分割來設(shè)計(jì)。
3.基于類型的分割
按完成的功能分割(歸類)。例如,在account類的操作中,可以分割為初始操作:open、setup;計(jì)算操作:deposit、withdraw;查詢操作:balance、summarize、creditlimit;終止操作:close。
七、由行為模型(狀態(tài)、活動(dòng)、順序和合作圖)導(dǎo)出的測(cè)試
1.簡(jiǎn)介
狀態(tài)轉(zhuǎn)換圖(STD)是可用來幫助導(dǎo)出類的動(dòng)態(tài)行為的測(cè)試序列,以及這些類與之合作的類的動(dòng)態(tài)行為的測(cè)試序列。
2.舉例
以account類為例,開始由empty acct狀態(tài)轉(zhuǎn)換為setup acct狀態(tài)。類實(shí)例的大多數(shù)行為發(fā)生在working acct狀態(tài)中。最后,取款和關(guān)閉分別使account類轉(zhuǎn)換到non-working acct和dead acct狀態(tài)。狀態(tài)轉(zhuǎn)換圖(STD)如圖7-3所示。
圖7-3 狀態(tài)轉(zhuǎn)換圖(STD)
這樣,設(shè)計(jì)的測(cè)試用例就能完成所有的狀態(tài)轉(zhuǎn)換,即操作序列應(yīng)當(dāng)能使account類所有允許的狀態(tài)進(jìn)行轉(zhuǎn)換。
(1)測(cè)試用例1
open+setupAcct+deposit(initial)+withdraw(final)+close;
應(yīng)該注意,該序列等同于一個(gè)最小測(cè)試序列,可加入其他測(cè)試序列到最小序列中。
(2)測(cè)試用例2
open+setupAccnt+deposit(initial)+deposit+balance+credit+withdraw(final)+close;
(3)測(cè)試用例3
open+setupAccnt+deposit(initial)+deposit+withdraw+accntlnfo+withdraw(final)+close。
還可導(dǎo)出更多的測(cè)試用例,以保證該類所有行為被充分檢查。在類行為導(dǎo)致與一個(gè)或多個(gè)類協(xié)作的情況下,可使用多個(gè)STD去跟蹤系統(tǒng)的行為流。
3.面向?qū)ο鬁y(cè)試的整體目標(biāo)
即以最小的工作量發(fā)現(xiàn)最多的錯(cuò)誤,和傳統(tǒng)軟件測(cè)試的目標(biāo)是一致的,但是由于OO軟件具有的特殊性質(zhì),在測(cè)試的策略和戰(zhàn)術(shù)上有很大不同。測(cè)試的視角擴(kuò)大到包括復(fù)審分析和設(shè)計(jì)模型,此外,測(cè)試的焦點(diǎn)從過程構(gòu)件(模塊)移向類。
(1)OOA(Object-Oriented Analysis)和OOD(Object-Oriented Design)的評(píng)審與傳統(tǒng)軟件的分析和設(shè)計(jì)相同,應(yīng)給出相應(yīng)的評(píng)審檢查表;
(2)OOP(Object-Oriented Programming)后,單元和組裝測(cè)試策略必須作相應(yīng)的改變;
(3)測(cè)試用例設(shè)計(jì)必須說明OO軟件特有的性質(zhì)。
- 全國職稱計(jì)算機(jī)考試講義·真題·預(yù)測(cè)三合一:中文Windows XP操作系統(tǒng)
- 全國計(jì)算機(jī)等級(jí)考試歷年真題與機(jī)考題庫:一級(jí)計(jì)算機(jī)基礎(chǔ)及MS Office應(yīng)用
- 全國職稱計(jì)算機(jī)考試標(biāo)準(zhǔn)教材與專用題庫:Excel 2007中文電子表格
- 全國計(jì)算機(jī)等級(jí)考試歷年真題與機(jī)考題庫:二級(jí)MS Office高級(jí)應(yīng)用
- 2020年3月全國計(jì)算機(jī)等級(jí)考試《四級(jí)軟件工程》復(fù)習(xí)全書【核心講義+歷年真題詳解】
- 汪博士解讀PMP考試
- 黑光造型:創(chuàng)意造型設(shè)計(jì)佳作賞析
- 大學(xué)計(jì)算機(jī)應(yīng)用基礎(chǔ)教程實(shí)驗(yàn)指導(dǎo)
- 全國計(jì)算機(jī)等級(jí)考試模擬考場(chǎng)二級(jí)Python
- 全國計(jì)算機(jī)等級(jí)考試真題匯編與專用題庫:二級(jí)MS Office高級(jí)應(yīng)用
- 5天通過職稱計(jì)算機(jī)考試(考點(diǎn)視頻串講+全真模擬):PowerPoint 2003中文演示文稿(第2版) (全國專業(yè)技術(shù)人員計(jì)算機(jī)應(yīng)用能力考試指導(dǎo)叢書)
- 2023年全國計(jì)算機(jī)等級(jí)考試上機(jī)考試題庫二級(jí)C語言
- 2020年3月全國計(jì)算機(jī)等級(jí)考試《二級(jí)Visual Basic語言程序設(shè)計(jì)》歷年真題與模擬試題詳解
- PMP項(xiàng)目管理認(rèn)證學(xué)習(xí)指南(第4版)
- 全國計(jì)算機(jī)等級(jí)考試歷年真題與機(jī)考題庫:三級(jí)網(wǎng)絡(luò)技術(shù)