清華大學鄭人杰殷昆教軟件工程講義08_第1頁
清華大學鄭人杰殷昆教軟件工程講義08_第2頁
清華大學鄭人杰殷昆教軟件工程講義08_第3頁
清華大學鄭人杰殷昆教軟件工程講義08_第4頁
清華大學鄭人杰殷昆教軟件工程講義08_第5頁
已閱讀5頁,還剩72頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、軟件工程軟件工程1 1軟件工程軟件工程 第八章第八章 面向?qū)ο蟮臏y試面向?qū)ο蟮臏y試8.1 面向?qū)ο鬁y試的概念面向?qū)ο鬁y試的概念8.2 開發(fā)前期的面向?qū)ο鬁y試開發(fā)前期的面向?qū)ο鬁y試8.3 開發(fā)后期的面向?qū)ο鬁y試開發(fā)后期的面向?qū)ο鬁y試8.4 分布式系統(tǒng)的測試分布式系統(tǒng)的測試軟件工程軟件工程2 28.1 8.1 面向?qū)ο鬁y試的概念面向?qū)ο鬁y試的概念 面向?qū)ο笙到y(tǒng)的測試與傳統(tǒng)的基于功能的系統(tǒng)面向?qū)ο笙到y(tǒng)的測試與傳統(tǒng)的基于功能的系統(tǒng)的測試之間存在很大差別:的測試之間存在很大差別:1) 對象作為一個單獨的構(gòu)件一般比一個功能模對象作為一個單獨的構(gòu)件一般比一個功能模塊大。塊大。2) 由對象到子系統(tǒng)的集成通常是

2、松散耦合的,由對象到子系統(tǒng)的集成通常是松散耦合的,沒有一個明顯的沒有一個明顯的“頂層頂層”。3) 如果對象被復用,測試者無權(quán)進入構(gòu)件內(nèi)部如果對象被復用,測試者無權(quán)進入構(gòu)件內(nèi)部來分析其代碼。來分析其代碼。軟件工程軟件工程3 3n面向?qū)ο蟮拈_發(fā)模型將系統(tǒng)開發(fā)分為面向?qū)ο蠓置嫦驅(qū)ο蟮拈_發(fā)模型將系統(tǒng)開發(fā)分為面向?qū)ο蠓治觯ㄎ觯╫oa),面向?qū)ο笤O(shè)計(),面向?qū)ο笤O(shè)計(ood)和面向?qū)Γ┖兔嫦驅(qū)ο缶幊蹋ㄏ缶幊蹋╫op)三個階段。)三個階段。n分析階段產(chǎn)生整個問題領(lǐng)域的抽象描述,在此基分析階段產(chǎn)生整個問題領(lǐng)域的抽象描述,在此基礎(chǔ)上,進一步歸納出適用于面向?qū)ο缶幊陶Z言的礎(chǔ)上,進一步歸納出適用于面向?qū)ο缶幊陶Z言

3、的類和類結(jié)構(gòu),最后形成代碼。類和類結(jié)構(gòu),最后形成代碼。n針對這種開發(fā)模型,結(jié)合傳統(tǒng)測試步驟的劃分,針對這種開發(fā)模型,結(jié)合傳統(tǒng)測試步驟的劃分,本著在整個開發(fā)過程中不斷測試的原則,應將開本著在整個開發(fā)過程中不斷測試的原則,應將開發(fā)階段的測試與編碼完成后的單元測試、集成測發(fā)階段的測試與編碼完成后的單元測試、集成測試、系統(tǒng)測試用一個測試模型描述。試、系統(tǒng)測試用一個測試模型描述。 軟件工程軟件工程4 4面向?qū)ο鬁y試模型面向?qū)ο鬁y試模型 oo system testoo integration testoo unit testooa testood testoop testooaoodoop軟件工程軟件工

4、程5 5nooa test和和ood test 是對分析結(jié)果和設(shè)計結(jié)果是對分析結(jié)果和設(shè)計結(jié)果的測試,主要是對分析設(shè)計產(chǎn)生的文本進行,是的測試,主要是對分析設(shè)計產(chǎn)生的文本進行,是軟件開發(fā)前期的關(guān)鍵性測試。軟件開發(fā)前期的關(guān)鍵性測試。noop test主要針對編程風格和程序代碼實現(xiàn)進行主要針對編程風格和程序代碼實現(xiàn)進行測試,其主要的測試內(nèi)容在面向?qū)ο髥卧獪y試和測試,其主要的測試內(nèi)容在面向?qū)ο髥卧獪y試和面向?qū)ο蠹蓽y試中體現(xiàn)。面向?qū)ο蠹蓽y試中體現(xiàn)。n面向?qū)ο髥卧獪y試是對程序內(nèi)部具體單一的功能面向?qū)ο髥卧獪y試是對程序內(nèi)部具體單一的功能模塊的測試,如果程序是用模塊的測試,如果程序是用c+語言語言實現(xiàn),主

5、要實現(xiàn),主要就是對類成員函數(shù)的測試。面向?qū)ο髥卧獪y試是就是對類成員函數(shù)的測試。面向?qū)ο髥卧獪y試是進行面向?qū)ο蠹蓽y試的基礎(chǔ)。進行面向?qū)ο蠹蓽y試的基礎(chǔ)。軟件工程軟件工程6 6n面向?qū)ο蠹蓽y試主要對系統(tǒng)內(nèi)部的相互服務進面向?qū)ο蠹蓽y試主要對系統(tǒng)內(nèi)部的相互服務進行測試,如成員函數(shù)間的相互作用,類間的消息行測試,如成員函數(shù)間的相互作用,類間的消息傳遞等。傳遞等。n面向?qū)ο蠹蓽y試不但要基于面向?qū)ο髥卧獪y試,面向?qū)ο蠹蓽y試不但要基于面向?qū)ο髥卧獪y試,更要參見更要參見ood或或ood test結(jié)果。結(jié)果。n面向?qū)ο笙到y(tǒng)測試是基于面向?qū)ο蠹蓽y試的最面向?qū)ο笙到y(tǒng)測試是基于面向?qū)ο蠹蓽y試的最后階段的測

6、試,主要以用戶需求為測試標準,也后階段的測試,主要以用戶需求為測試標準,也需要借鑒需要借鑒ooa或或ooa test結(jié)果。結(jié)果。 軟件工程軟件工程7 78.2 8.2 開發(fā)前期的面向?qū)ο鬁y試開發(fā)前期的面向?qū)ο鬁y試 n面向?qū)ο蟮南到y(tǒng)開發(fā)經(jīng)歷面向?qū)ο蟮南到y(tǒng)開發(fā)經(jīng)歷 面向?qū)ο蠓治觯嫦驅(qū)ο蠓治觯╫oa) 面向?qū)ο笤O(shè)計(面向?qū)ο笤O(shè)計(ood) 面向?qū)ο缶幊蹋嫦驅(qū)ο缶幊蹋╫op)n等三個階段。在這個時期的測試工作主要是靜態(tài)等三個階段。在這個時期的測試工作主要是靜態(tài)測試。通過各種評審和質(zhì)量分析活動,完成必須測試。通過各種評審和質(zhì)量分析活動,完成必須的測試工作,及時檢測和克服各種缺陷。的測試工作,及時檢測

7、和克服各種缺陷。軟件工程軟件工程8 88.2.1 8.2.1 面向?qū)ο蠓治龅臏y試面向?qū)ο蠓治龅臏y試 n傳統(tǒng)的面向過程分析是一個功能分解的過程,是把傳統(tǒng)的面向過程分析是一個功能分解的過程,是把一個系統(tǒng)看成可以分解的功能的集合。這種傳統(tǒng)的一個系統(tǒng)看成可以分解的功能的集合。這種傳統(tǒng)的功能分解分析法的著眼點在于功能分解分析法的著眼點在于一個系統(tǒng)需要什么樣一個系統(tǒng)需要什么樣的信息處理方法和過程,以過程的抽象來對待系統(tǒng)的信息處理方法和過程,以過程的抽象來對待系統(tǒng)的需要的需要。n面向?qū)ο蠓治觯嫦驅(qū)ο蠓治觯╫oa)是)是“把把er圖和語義網(wǎng)絡(luò)圖和語義網(wǎng)絡(luò)模型,即信息模型中的概念,與面向?qū)ο蟪绦蛟O(shè)計模型,即信

8、息模型中的概念,與面向?qū)ο蟪绦蛟O(shè)計語言中的重要概念結(jié)合在一起而形成的分析方法語言中的重要概念結(jié)合在一起而形成的分析方法”,最后最后得到問題領(lǐng)域的可視的形式描述得到問題領(lǐng)域的可視的形式描述。 nooa的結(jié)果是為后續(xù)階段中類的選定和實現(xiàn),類層的結(jié)果是為后續(xù)階段中類的選定和實現(xiàn),類層軟件工程軟件工程9 9層次結(jié)構(gòu)的組織和實現(xiàn)提供平臺。層次結(jié)構(gòu)的組織和實現(xiàn)提供平臺。nooa對問題領(lǐng)域分析抽象的不完整,最終會影響軟對問題領(lǐng)域分析抽象的不完整,最終會影響軟件的功能實現(xiàn),導致軟件開發(fā)后期大量可避免的修件的功能實現(xiàn),導致軟件開發(fā)后期大量可避免的修補工作;而一些冗余的對象或結(jié)構(gòu)會影響類的選定、補工作;而一些冗余

9、的對象或結(jié)構(gòu)會影響類的選定、程序的整體結(jié)構(gòu)或增加程序員不必要的工作量。因程序的整體結(jié)構(gòu)或增加程序員不必要的工作量。因此,此,ooa測試的重點在其完整性和冗余性。測試的重點在其完整性和冗余性。n根據(jù)根據(jù)coad和和yourdon方法所提出的方法所提出的ooa實現(xiàn)步驟,實現(xiàn)步驟,對對ooa階段的測試劃分為以下五個方面:階段的測試劃分為以下五個方面:對認定的對認定的類類的測試的測試對認定的對認定的結(jié)構(gòu)結(jié)構(gòu)的測試的測試對認定的對認定的主題主題的測試的測試軟件工程軟件工程1010 對定義的對定義的屬性屬性和和實例連接實例連接的測試的測試 對定義的對定義的服務服務和和消息連接消息連接的測試的測試 1. 對

10、認定的類的測試對認定的類的測試 ooa中認定的類是對問題領(lǐng)域中的中認定的類是對問題領(lǐng)域中的結(jié)構(gòu)結(jié)構(gòu),其他其他相關(guān)系統(tǒng)相關(guān)系統(tǒng),設(shè)備設(shè)備,被記憶的事件被記憶的事件,系統(tǒng)涉及的系統(tǒng)涉及的人員人員等實際對象的抽象。對它的測試可以從如等實際對象的抽象。對它的測試可以從如下方面考慮:下方面考慮:a) 認定的類是否認定的類是否全面全面,是否問題領(lǐng)域中所有涉,是否問題領(lǐng)域中所有涉及到的對象都反映在認定的類中。及到的對象都反映在認定的類中。b) 認定的類是否具有認定的類是否具有多個屬性多個屬性。只有一個屬性。只有一個屬性的類通常應看成其他類的屬性,而不是抽象的類通常應看成其他類的屬性,而不是抽象軟件工程軟件工

11、程11 11為獨立的類。為獨立的類。c) 認定為同一個類的對象是否有共同的,區(qū)別認定為同一個類的對象是否有共同的,區(qū)別于其他類對象的共同屬性。于其他類對象的共同屬性。d) 對認定為同一類的對象是否對認定為同一類的對象是否提供或需要相同提供或需要相同的服務的服務,如果服務隨著不同的對象而變化,如果服務隨著不同的對象而變化,認定的對象就需要分解或利用繼承性來分類認定的對象就需要分解或利用繼承性來分類表示。表示。e) 如果系統(tǒng)不需要始終保持類所代表的對象的如果系統(tǒng)不需要始終保持類所代表的對象的信息,認定的類也無必要存在。信息,認定的類也無必要存在。f)認定的類的名稱應該盡量準確,適用。認定的類的名稱

12、應該盡量準確,適用。2. 對認定的結(jié)構(gòu)的測試對認定的結(jié)構(gòu)的測試軟件工程軟件工程1212 在在coad和和yourdon方法中,認定的結(jié)構(gòu)分為兩方法中,認定的結(jié)構(gòu)分為兩種:種:泛化結(jié)構(gòu)泛化結(jié)構(gòu)和和復合結(jié)構(gòu)復合結(jié)構(gòu)。泛化泛化結(jié)構(gòu)體現(xiàn)了問結(jié)構(gòu)體現(xiàn)了問題領(lǐng)域中對象的一般與特殊的關(guān)系,題領(lǐng)域中對象的一般與特殊的關(guān)系,復合復合結(jié)構(gòu)結(jié)構(gòu)體現(xiàn)了問題領(lǐng)域中對象的整體與局部的關(guān)系。體現(xiàn)了問題領(lǐng)域中對象的整體與局部的關(guān)系。1) 對對泛化泛化結(jié)構(gòu)結(jié)構(gòu)的測試可從如下方面著手:的測試可從如下方面著手:a) 對于結(jié)構(gòu)中的一個類,尤其是處于高層的類,對于結(jié)構(gòu)中的一個類,尤其是處于高層的類,看是否能在問題領(lǐng)域中派生出其下一層的

13、類??词欠衲茉趩栴}領(lǐng)域中派生出其下一層的類。b) 對于結(jié)構(gòu)中的一個類,尤其是處于同一低層對于結(jié)構(gòu)中的一個類,尤其是處于同一低層的類,看是否能抽象出在現(xiàn)實世界中有意義的類,看是否能抽象出在現(xiàn)實世界中有意義的更一般的上層的類。的更一般的上層的類。軟件工程軟件工程1313c) 高層的類的屬性和服務是否完全體現(xiàn)下層高層的類的屬性和服務是否完全體現(xiàn)下層的共性。的共性。d) 低層的類是否基于其上層類的屬性和服務低層的類是否基于其上層類的屬性和服務并具有自己的特殊性。并具有自己的特殊性。2) 對對復合結(jié)構(gòu)復合結(jié)構(gòu)的測試從如下方面入手:的測試從如下方面入手:a) 整體類和局部類的復合(聚合)關(guān)系是否符整體類和

14、局部類的復合(聚合)關(guān)系是否符合現(xiàn)實的關(guān)系。合現(xiàn)實的關(guān)系。b) 整體類的局部類是否在問題領(lǐng)域中有實際應整體類的局部類是否在問題領(lǐng)域中有實際應用。用。c) 整體類中是否遺漏了在問題領(lǐng)域中有用的局整體類中是否遺漏了在問題領(lǐng)域中有用的局部類。部類。軟件工程軟件工程1414d) 局部類是否能夠在問題領(lǐng)域中組合出新的有局部類是否能夠在問題領(lǐng)域中組合出新的有現(xiàn)實意義的整體類?,F(xiàn)實意義的整體類。3. 對認定的主題的測試對認定的主題的測試 主題是在對象和結(jié)構(gòu)的基礎(chǔ)上更高一層的抽象,主題是在對象和結(jié)構(gòu)的基礎(chǔ)上更高一層的抽象,是為了提供是為了提供ooa分析結(jié)果的可見性,如同文章分析結(jié)果的可見性,如同文章對各部分內(nèi)

15、容的概要。對各部分內(nèi)容的概要。 對主題的測試應該考慮以下方面:對主題的測試應該考慮以下方面:a) 貫徹貫徹george miller 的的“7+2”原則,如果主原則,如果主題個數(shù)超過題個數(shù)超過 7 個,就要求對有較密切屬性和個,就要求對有較密切屬性和服務的主題進行歸并。服務的主題進行歸并。軟件工程軟件工程1515b) 主題所反映的一組類和結(jié)構(gòu)是否具有相同和主題所反映的一組類和結(jié)構(gòu)是否具有相同和相近的屬性和服務。相近的屬性和服務。c) 認定的主題是否是類和結(jié)構(gòu)更高層的抽象,認定的主題是否是類和結(jié)構(gòu)更高層的抽象,是否便于理解是否便于理解ooa結(jié)果的概貌(尤其是對非結(jié)果的概貌(尤其是對非技術(shù)人員的技

16、術(shù)人員的ooa 結(jié)果讀者)。結(jié)果讀者)。d) 主題間的消息連接(抽象)是否代表了主題主題間的消息連接(抽象)是否代表了主題所反映的類和結(jié)構(gòu)之間的所有關(guān)聯(lián)。所反映的類和結(jié)構(gòu)之間的所有關(guān)聯(lián)。4. 對定義的屬性和實例連接的測試對定義的屬性和實例連接的測試 屬性描述類或結(jié)構(gòu)中實例(對象)的特性。而屬性描述類或結(jié)構(gòu)中實例(對象)的特性。而實例連接則反映實例集合之間的映射關(guān)系。實例連接則反映實例集合之間的映射關(guān)系。 軟件工程軟件工程1616 對屬性和實例連接的測試從如下方面考慮:對屬性和實例連接的測試從如下方面考慮:a) 定義的屬性是否對相應的類和泛化結(jié)構(gòu)的每定義的屬性是否對相應的類和泛化結(jié)構(gòu)的每個實例都

17、適用。個實例都適用。b) 定義的屬性在現(xiàn)實世界中是否與這種實例關(guān)定義的屬性在現(xiàn)實世界中是否與這種實例關(guān)系密切。系密切。c) 定義的屬性在問題領(lǐng)域中是否與這種實例關(guān)定義的屬性在問題領(lǐng)域中是否與這種實例關(guān)系密切。系密切。d) 定義的屬性是否能夠不依賴于其他屬性被獨定義的屬性是否能夠不依賴于其他屬性被獨立理解。立理解。e) 定義的屬性在泛化結(jié)構(gòu)中的位置是否恰當,定義的屬性在泛化結(jié)構(gòu)中的位置是否恰當,低層類的共有屬性是否在其上層類的屬性中低層類的共有屬性是否在其上層類的屬性中軟件工程軟件工程1717有定義。有定義。f)問題領(lǐng)域中每個類的屬性是否定義完整。問題領(lǐng)域中每個類的屬性是否定義完整。g) 定義的

18、實例連接是否符合實際。定義的實例連接是否符合實際。h) 在問題領(lǐng)域中實例連接的定義是否完整,特在問題領(lǐng)域中實例連接的定義是否完整,特別需要注意一對多和多對多的實例連接。別需要注意一對多和多對多的實例連接。5. 對定義的服務和消息關(guān)聯(lián)的測試對定義的服務和消息關(guān)聯(lián)的測試 定義服務就是定義每一個類和結(jié)構(gòu)在問題領(lǐng)域定義服務就是定義每一個類和結(jié)構(gòu)在問題領(lǐng)域中的行為。由于問題領(lǐng)域中的實例之間需要通中的行為。由于問題領(lǐng)域中的實例之間需要通信,在信,在ooa中就需要定義消息的連接。中就需要定義消息的連接。 對服務和消息連接的測試應考慮以下幾方面:對服務和消息連接的測試應考慮以下幾方面: 軟件工程軟件工程181

19、8a) 類和結(jié)構(gòu)在問題領(lǐng)域中的實例具有不同的狀類和結(jié)構(gòu)在問題領(lǐng)域中的實例具有不同的狀態(tài),是否為狀態(tài)轉(zhuǎn)換定義了相應的服務。態(tài),是否為狀態(tài)轉(zhuǎn)換定義了相應的服務。b) 類或結(jié)構(gòu)所需要的服務是否都定義了相應的類或結(jié)構(gòu)所需要的服務是否都定義了相應的消息連接。消息連接。c) 定義的消息連接所調(diào)用的服務是否正確。定義的消息連接所調(diào)用的服務是否正確。d) 沿著消息連接所執(zhí)行的線索(消息的調(diào)用序沿著消息連接所執(zhí)行的線索(消息的調(diào)用序列)是否合理,是否符合實際。列)是否合理,是否符合實際。e) 定義的服務是否有重復,是否定義了能夠得定義的服務是否有重復,是否定義了能夠得到的服務。到的服務。 軟件工程軟件工程191

20、98.2.2 8.2.2 面向?qū)ο笤O(shè)計的測試面向?qū)ο笤O(shè)計的測試 n面向?qū)ο笤O(shè)計(面向?qū)ο笤O(shè)計(ood)從)從“建模的觀點建模的觀點”出發(fā),基出發(fā),基于于ooa模型歸納出類,并建立類的層次結(jié)構(gòu)或進一模型歸納出類,并建立類的層次結(jié)構(gòu)或進一步構(gòu)造成類庫,實現(xiàn)分析結(jié)果對問題領(lǐng)域的抽象。步構(gòu)造成類庫,實現(xiàn)分析結(jié)果對問題領(lǐng)域的抽象。nood歸納出的類,可以是歸納出的類,可以是ooa類的類的簡單延續(xù)簡單延續(xù),也,也可以是基于設(shè)計要求可以是基于設(shè)計要求新建立新建立或或從已有類演化從已有類演化的類。的類。因此,因此,ood是是ooa的進一步細化和更高層的抽象,的進一步細化和更高層的抽象,ood與與ooa 的界限

21、通常是難以嚴格區(qū)分的。的界限通常是難以嚴格區(qū)分的。nood確定類和類結(jié)構(gòu)是想通過重新組合或加以適當確定類和類結(jié)構(gòu)是想通過重新組合或加以適當?shù)难a充,可方便地實現(xiàn)功能的復用和擴充。的補充,可方便地實現(xiàn)功能的復用和擴充。 軟件工程軟件工程2020nood的測試可從如下三方面考慮:的測試可從如下三方面考慮: 對認定的類的測試對認定的類的測試 對構(gòu)造的類層次結(jié)構(gòu)的測試對構(gòu)造的類層次結(jié)構(gòu)的測試 對類庫的支持的測試對類庫的支持的測試1. 對認定的類的測試對認定的類的測試 認定的類的測試應考慮以下幾個方面:認定的類的測試應考慮以下幾個方面:a) 是否涵蓋了是否涵蓋了ooa中所有認定的對象。中所有認定的對象。b

22、) 是否能體現(xiàn)是否能體現(xiàn)ooa中定義的屬性。中定義的屬性。c) 是否能實現(xiàn)是否能實現(xiàn)ooa中定義的服務。中定義的服務。d) 是否對應著一個含義明確的數(shù)據(jù)抽象。是否對應著一個含義明確的數(shù)據(jù)抽象。 軟件工程軟件工程2121e) 是否盡可能少地依賴其他類。是否盡可能少地依賴其他類。f)類中的方法(類中的方法(c+稱為類的成員函數(shù))是否稱為類的成員函數(shù))是否只有單一用途。只有單一用途。2. 對構(gòu)造的類層次結(jié)構(gòu)的測試對構(gòu)造的類層次結(jié)構(gòu)的測試 為能充分發(fā)揮面向?qū)ο蟮睦^承共享特性,為能充分發(fā)揮面向?qū)ο蟮睦^承共享特性,ood的類層次結(jié)構(gòu),通?;诘念悓哟谓Y(jié)構(gòu),通?;趏oa中產(chǎn)生的泛化結(jié)中產(chǎn)生的泛化結(jié)構(gòu)的原則

23、來組織,著重體現(xiàn)父類和子類之間一構(gòu)的原則來組織,著重體現(xiàn)父類和子類之間一般性和特殊性關(guān)系。般性和特殊性關(guān)系。 在當前的問題領(lǐng)域,對類層次結(jié)構(gòu)的主要要求在當前的問題領(lǐng)域,對類層次結(jié)構(gòu)的主要要求是能在解空間構(gòu)造實現(xiàn)全部功能的結(jié)構(gòu)框架。是能在解空間構(gòu)造實現(xiàn)全部功能的結(jié)構(gòu)框架。為此應做如下幾個方面的檢查:為此應做如下幾個方面的檢查: 軟件工程軟件工程2222a) 類層次結(jié)構(gòu)中是否涵蓋了所有定義的類。類層次結(jié)構(gòu)中是否涵蓋了所有定義的類。b) 是否能體現(xiàn)是否能體現(xiàn)ooa中所定義的實例連接。中所定義的實例連接。c) 是否能實現(xiàn)是否能實現(xiàn)ooa中所定義的消息連接。中所定義的消息連接。d) 子類是否具有父類沒有

24、的新特性。子類是否具有父類沒有的新特性。e) 子類之間的共同特性是否完全在父類中得以子類之間的共同特性是否完全在父類中得以體現(xiàn)。體現(xiàn)。3. 對類庫支持的測試對類庫支持的測試 對類庫的支持雖然也屬于類層次結(jié)構(gòu)的組織問對類庫的支持雖然也屬于類層次結(jié)構(gòu)的組織問題,但其強調(diào)的重點是軟件的復用。由于它并題,但其強調(diào)的重點是軟件的復用。由于它并不直接影響當前軟件的開發(fā)和功能實現(xiàn),可以不直接影響當前軟件的開發(fā)和功能實現(xiàn),可以將其單獨提出來測試。將其單獨提出來測試。 軟件工程軟件工程2323 有關(guān)類庫支持的測試可從以下幾個方面入手有關(guān)類庫支持的測試可從以下幾個方面入手:a) 一組子類中有關(guān)某種含義相同或基本相

25、同的一組子類中有關(guān)某種含義相同或基本相同的操作,是否有相同的接口(包括名字和參數(shù)操作,是否有相同的接口(包括名字和參數(shù)表)。表)。b) 類中方法(類中方法(c+稱為類的成員函數(shù))的功能稱為類的成員函數(shù))的功能是否比較單一,相應的代碼行是否較少(建是否比較單一,相應的代碼行是否較少(建議不超過議不超過100行)。行)。c) 類的層次結(jié)構(gòu)是否是深度大,寬度小。類的層次結(jié)構(gòu)是否是深度大,寬度小。 軟件工程軟件工程24248.2.3 8.2.3 面向?qū)ο缶幊痰臏y試面向?qū)ο缶幊痰臏y試 n典型的面向?qū)ο蟪绦蚓哂械湫偷拿嫦驅(qū)ο蟪绦蚓哂欣^承繼承、封裝封裝和和多態(tài)多態(tài)等新特等新特性,這使得傳統(tǒng)的測試策略必須有所

26、改變。性,這使得傳統(tǒng)的測試策略必須有所改變。n封裝封裝是對數(shù)據(jù)的隱藏,外界只能通過接口提供的操是對數(shù)據(jù)的隱藏,外界只能通過接口提供的操作來訪問或修改數(shù)據(jù),這就降低了直接接觸數(shù)據(jù)的作來訪問或修改數(shù)據(jù),這就降低了直接接觸數(shù)據(jù)的可能性,妨礙了對非法數(shù)據(jù)操作的測試??赡苄裕恋K了對非法數(shù)據(jù)操作的測試。n繼承繼承提高了代碼的復用率,同時也提高了錯誤傳播提高了代碼的復用率,同時也提高了錯誤傳播的概率。繼承向測試提出了這樣一個難題:對繼承的概率。繼承向測試提出了這樣一個難題:對繼承的代碼究竟如何測試?的代碼究竟如何測試?n多態(tài)多態(tài)令面向?qū)ο蟪绦驅(qū)ν獗憩F(xiàn)出強大的處理能力,令面向?qū)ο蟪绦驅(qū)ν獗憩F(xiàn)出強大的處理能力

27、,軟件工程軟件工程2525但同時卻使得程序內(nèi)但同時卻使得程序內(nèi)“同一同一”函數(shù)的行為復雜化,函數(shù)的行為復雜化,測試時不得不考慮不同類型的同名操作具體的實測試時不得不考慮不同類型的同名操作具體的實現(xiàn)代碼和產(chǎn)生的行為?,F(xiàn)代碼和產(chǎn)生的行為。n面向?qū)ο蟪绦蚴前压δ艿膶崿F(xiàn)分布在類中。與某面向?qū)ο蟪绦蚴前压δ艿膶崿F(xiàn)分布在類中。與某種設(shè)計功能相關(guān)的一組對象,通過對象提供的種設(shè)計功能相關(guān)的一組對象,通過對象提供的服服務務和對象之間的和對象之間的消息傳遞消息傳遞,共同協(xié)作來,共同協(xié)作來實現(xiàn)這個實現(xiàn)這個功能功能。這種面向?qū)ο蟪绦蝻L格,可將出現(xiàn)的錯誤。這種面向?qū)ο蟪绦蝻L格,可將出現(xiàn)的錯誤精確定位在某一個具體的對象。

28、精確定位在某一個具體的對象。n因此,因此,在面向?qū)ο缶幊蹋ㄔ诿嫦驅(qū)ο缶幊蹋╫op)階段,將測試的)階段,將測試的目光集中在類目光集中在類功能的實現(xiàn)和相應的面向?qū)ο蟪绦蚬δ艿膶崿F(xiàn)和相應的面向?qū)ο蟪绦蝻L格上。風格上。 軟件工程軟件工程26261. 1. 數(shù)據(jù)成員是否滿足數(shù)據(jù)封裝的要求數(shù)據(jù)成員是否滿足數(shù)據(jù)封裝的要求n檢查數(shù)據(jù)成員是否滿足數(shù)據(jù)封裝的要求,就是檢查檢查數(shù)據(jù)成員是否滿足數(shù)據(jù)封裝的要求,就是檢查其其數(shù)據(jù)成員是否能被外界(數(shù)據(jù)成員所屬的類或子數(shù)據(jù)成員是否能被外界(數(shù)據(jù)成員所屬的類或子類以外的調(diào)用)直接調(diào)用類以外的調(diào)用)直接調(diào)用。更直觀的說,當改變數(shù)。更直觀的說,當改變數(shù)據(jù)成員的結(jié)構(gòu)時,看其是否

29、影響了類的對外接口,據(jù)成員的結(jié)構(gòu)時,看其是否影響了類的對外接口,是否會導致相應外界必須改動。是否會導致相應外界必須改動。n值得注意,有時強制的類型轉(zhuǎn)換會破壞數(shù)據(jù)的封裝值得注意,有時強制的類型轉(zhuǎn)換會破壞數(shù)據(jù)的封裝特性。例如:特性。例如: class hiden private: int a = 1;軟件工程軟件工程2727 char *p = hiden; class visible public: int b = 2; char *s = visible; .hiden pp;visible *qq = (visible *)& pp;n在上面的程序段中,在上面的程序段中,pp的數(shù)據(jù)成

30、員可以通過的數(shù)據(jù)成員可以通過qq被隨被隨意訪問。意訪問。 軟件工程軟件工程28282. 2. 類是否實現(xiàn)了要求的功能類是否實現(xiàn)了要求的功能 n類的功能都是通過類的成員函數(shù)實現(xiàn)的。在測試類類的功能都是通過類的成員函數(shù)實現(xiàn)的。在測試類的功能實現(xiàn)時,應該首先保證類成員函數(shù)執(zhí)行的正的功能實現(xiàn)時,應該首先保證類成員函數(shù)執(zhí)行的正確性。確性。n單獨地看類的成員函數(shù),與過程性程序中的函數(shù)或單獨地看類的成員函數(shù),與過程性程序中的函數(shù)或過程沒有本質(zhì)的區(qū)別,幾乎所有傳統(tǒng)的單元測試中過程沒有本質(zhì)的區(qū)別,幾乎所有傳統(tǒng)的單元測試中使用的方法,都可在面向?qū)ο蟮膯卧獪y試中使用。使用的方法,都可在面向?qū)ο蟮膯卧獪y試中使用。n類

31、函數(shù)成員的正確行為只是類能夠?qū)崿F(xiàn)要求功能的類函數(shù)成員的正確行為只是類能夠?qū)崿F(xiàn)要求功能的基礎(chǔ),而類成員函數(shù)之間的交互和類之間的服務調(diào)基礎(chǔ),而類成員函數(shù)之間的交互和類之間的服務調(diào)用是單元測試無法確定的。因此需要進行面向?qū)ο笥檬菃卧獪y試無法確定的。因此需要進行面向?qū)ο蟮募蓽y試。的集成測試。軟件工程軟件工程2929n需要注意的是,測試類的功能,不能僅滿足于被需要注意的是,測試類的功能,不能僅滿足于被測試代碼能測試代碼能無錯運行無錯運行或被測試類提供的或被測試類提供的功能無錯功能無錯,還應該以還應該以ood結(jié)果為依據(jù),檢測類提供的功能是結(jié)果為依據(jù),檢測類提供的功能是否滿足設(shè)計的要求,是否有缺陷。否滿足

32、設(shè)計的要求,是否有缺陷。n必要時(如通過必要時(如通過ood結(jié)果仍不清楚明確的地方)結(jié)果仍不清楚明確的地方)還應該參照還應該參照ooa的結(jié)果的結(jié)果,并以其為最終標準。,并以其為最終標準。軟件工程軟件工程3030n編程完成之后,需要經(jīng)歷三個階段的測試:編程完成之后,需要經(jīng)歷三個階段的測試: 單元測試單元測試 集成測試集成測試 系統(tǒng)測試系統(tǒng)測試n傳統(tǒng)的單元測試是針對程序的函數(shù)、過程或完成傳統(tǒng)的單元測試是針對程序的函數(shù)、過程或完成某一特定功能的程序塊所進行的測試。某一特定功能的程序塊所進行的測試。8.3 8.3 開發(fā)后期的面向?qū)ο鬁y試開發(fā)后期的面向?qū)ο鬁y試8.3.1 8.3.1 面向?qū)ο蟮膯卧獪y試(

33、面向?qū)ο蟮膯卧獪y試(unit testunit test)軟件工程軟件工程3131n面向?qū)ο蟮膯卧獪y試則是針對面向?qū)ο蟪绦虻幕嫦驅(qū)ο蟮膯卧獪y試則是針對面向?qū)ο蟪绦虻幕締卧締卧獙ο箢?。為此需要分兩步走:對象類。為此需要分兩步走?) 測試與對象相關(guān)聯(lián)的單個操作測試與對象相關(guān)聯(lián)的單個操作 它們是一些函它們是一些函數(shù)或程序,傳統(tǒng)的白盒測試和黑盒測試方法都數(shù)或程序,傳統(tǒng)的白盒測試和黑盒測試方法都可以使用??梢允褂?。2) 測試單個對象類測試單個對象類 黑盒測試的原理不變,但等黑盒測試的原理不變,但等價劃分的概念要擴展以適合操作序列的情況。價劃分的概念要擴展以適合操作序列的情況。n在設(shè)計測試用例時,

34、可基于以下兩個假設(shè):在設(shè)計測試用例時,可基于以下兩個假設(shè):1. 1. 對象操作的測試對象操作的測試軟件工程軟件工程3232a) 如果操作(成員函數(shù))對某一類輸入中的一個如果操作(成員函數(shù))對某一類輸入中的一個數(shù)據(jù)正確執(zhí)行,對同類中的其他輸入也能正確數(shù)據(jù)正確執(zhí)行,對同類中的其他輸入也能正確執(zhí)行。執(zhí)行。b) 如果操作(成員函數(shù))對某一復雜度的輸入能如果操作(成員函數(shù))對某一復雜度的輸入能夠正確執(zhí)行,則對更高復雜度的輸入也應能正夠正確執(zhí)行,則對更高復雜度的輸入也應能正確執(zhí)行。確執(zhí)行。例如需要選擇字符串作為輸入時,基例如需要選擇字符串作為輸入時,基于本假設(shè),就無需計較字符串的長度。除非字于本假設(shè),就無

35、需計較字符串的長度。除非字符串的長度是固定的,如符串的長度是固定的,如ip地址字符串。地址字符串。 n在面向?qū)ο蟪绦蛑?,對象的操作(成員函數(shù))通在面向?qū)ο蟪绦蛑?,對象的操作(成員函數(shù))通常都很小,功能單一,函數(shù)之間調(diào)用頻繁,容易常都很小,功能單一,函數(shù)之間調(diào)用頻繁,容易出現(xiàn)一些不宜發(fā)現(xiàn)的錯誤。例如:出現(xiàn)一些不宜發(fā)現(xiàn)的錯誤。例如:軟件工程軟件工程3333 if ( - -1 = write(fid, buffer, amount) ) error_out();該語句沒有全面檢查該語句沒有全面檢查 write() 的返回值,無意中的返回值,無意中假設(shè)了只有數(shù)據(jù)被假設(shè)了只有數(shù)據(jù)被完全寫入完全寫入和和

36、沒有寫入沒有寫入兩種情兩種情況。此測試還忽略了數(shù)據(jù)況。此測試還忽略了數(shù)據(jù)部分寫入部分寫入的情況,就的情況,就給程序遺留了隱患。給程序遺留了隱患。 按程序的設(shè)計,使用函數(shù)按程序的設(shè)計,使用函數(shù) strrchr() 查找最后的查找最后的匹配字符,但程序中誤寫成了函數(shù)匹配字符,但程序中誤寫成了函數(shù) strchr(),使,使程序功能實現(xiàn)時查找的是第一個匹配字符。程序功能實現(xiàn)時查找的是第一個匹配字符。 程序中將程序中將 if ( strncmp(str1, str2, strlen(str1) ) 誤寫成了誤寫成了if ( strncmp(str1, str2, strlen(str2) )。如果測試用

37、例中使用的數(shù)據(jù)如果測試用例中使用的數(shù)據(jù) str1 和和 str2 長度相長度相軟件工程軟件工程3434同,就無法檢測出。同,就無法檢測出。 因此,在設(shè)計測試用例時,應對因此,在設(shè)計測試用例時,應對以函數(shù)返回值以函數(shù)返回值作為條件判斷作為條件判斷,字符串操作字符串操作等情況特別注意。等情況特別注意。n面向?qū)ο缶幊痰奶匦允沟脤Τ蓡T函數(shù)的測試,又面向?qū)ο缶幊痰奶匦允沟脤Τ蓡T函數(shù)的測試,又不完全等同于傳統(tǒng)的函數(shù)或過程測試。尤其是繼不完全等同于傳統(tǒng)的函數(shù)或過程測試。尤其是繼承特性和多態(tài)特性,承特性和多態(tài)特性,brian marick 提出提出了兩點:了兩點:1) 繼承的成員函數(shù)可能需要重新測試繼承的成員

38、函數(shù)可能需要重新測試 對父類中已經(jīng)測試過的成員函數(shù),兩種情況需對父類中已經(jīng)測試過的成員函數(shù),兩種情況需要在子類中重新測試:要在子類中重新測試:a) 繼承的成員函數(shù)在子類中做了改動;繼承的成員函數(shù)在子類中做了改動;b) 成員函數(shù)調(diào)用了改動過的成員函數(shù)。成員函數(shù)調(diào)用了改動過的成員函數(shù)。軟件工程軟件工程3535 例如:假設(shè)父類例如:假設(shè)父類 bass 有兩個成員函數(shù):有兩個成員函數(shù): inherited() redefined() 若子類若子類 derived 對對 redefined()做了改動,做了改動,derived:redefined() 必必需重新測試。但如果需重新測試。但如果 deriv

39、ed:inherited() 包含有調(diào)用包含有調(diào)用 redefined() 的的語句(如:語句(如:x = x / redefined()),就需要重新),就需要重新測試;反之,則不必重新測試。測試;反之,則不必重新測試。2)對父類的測試用例不能照搬到子類對父類的測試用例不能照搬到子類 根據(jù)以上的假設(shè),根據(jù)以上的假設(shè),base:redefined() 和和derived:redefined() 是不同的成員函數(shù),它們是不同的成員函數(shù),它們軟件工程軟件工程3636有不同的說明和實現(xiàn)。對此,應該對有不同的說明和實現(xiàn)。對此,應該對 derived:redefined() 重新設(shè)計測試用例。重新設(shè)計測

40、試用例。 由于面向?qū)ο蟮睦^承性,使得兩個函數(shù)還是有由于面向?qū)ο蟮睦^承性,使得兩個函數(shù)還是有相似之處,故只需在相似之處,故只需在 base:redefined() 的測試的測試用例基礎(chǔ)上添加對用例基礎(chǔ)上添加對 derived:redfined() 的新測的新測試用例。試用例。例如:例如: base:redefined() 含有如下語句含有如下語句 if ( value 0 ) message (less); else if ( value = 0 ) message (equal); else message (more); derived:redfined() 中定義為中定義為軟件工程軟件工程

41、3737 if ( value 0 ) message (less); else if ( value = 0 ) message (“it is equal); else message (more); if ( value = 88 ) message(luck); 在原有的測試上,對在原有的測試上,對 derived:redfined() 的測的測試只需做如下改動:改動試只需做如下改動:改動 value = 0 的預期測的預期測試結(jié)果,并增加試結(jié)果,并增加 value = 88 的測試。的測試。n多態(tài)有幾種不同的形式,如多態(tài)有幾種不同的形式,如參數(shù)多態(tài)參數(shù)多態(tài),包含多態(tài)包含多態(tài),重載多態(tài)

42、重載多態(tài)。n包含多態(tài)包含多態(tài)和和重載多態(tài)重載多態(tài)在面向?qū)ο笳Z言程序中通常在面向?qū)ο笳Z言程序中通常軟件工程軟件工程3838n體現(xiàn)在體現(xiàn)在子類與父類的繼承關(guān)系子類與父類的繼承關(guān)系上,對這兩種多態(tài)上,對這兩種多態(tài)的測試可參照對父類成員函數(shù)繼承和重載的情況的測試可參照對父類成員函數(shù)繼承和重載的情況處理。處理。n在測試對象時,完全的覆蓋測試應當包括:在測試對象時,完全的覆蓋測試應當包括: 隔離對象中所有隔離對象中所有操作操作,進行獨立測試。,進行獨立測試。 測試對象中所有測試對象中所有屬性屬性的設(shè)置和訪問。的設(shè)置和訪問。 測試對象的所有可能的測試對象的所有可能的狀態(tài)轉(zhuǎn)換狀態(tài)轉(zhuǎn)換。所有可能。所有可能引起狀

43、態(tài)改變的事件都要模擬到。引起狀態(tài)改變的事件都要模擬到。2. 2. 對象類測試對象類測試軟件工程軟件工程3939對象類,作為在語法上獨立的構(gòu)件,應當允許在對象類,作為在語法上獨立的構(gòu)件,應當允許在不同應用中使用。每個類都應是可靠的且不需了不同應用中使用。每個類都應是可靠的且不需了解任何實現(xiàn)細節(jié)就能復用。因此對象類應盡可能解任何實現(xiàn)細節(jié)就能復用。因此對象類應盡可能孤立地進行測試。孤立地進行測試。設(shè)計操作的測試用例時的要點:設(shè)計操作的測試用例時的要點:1) 首先定義測試對象首先定義測試對象各操作各操作的測試用例。的測試用例。2) 對于一個單獨的操作,可通過該操作的對于一個單獨的操作,可通過該操作的前

44、置條前置條件件選擇測試用例,產(chǎn)生輸出,讓測試者能夠判選擇測試用例,產(chǎn)生輸出,讓測試者能夠判斷斷后置條件后置條件是否能夠得到滿足。是否能夠得到滿足。3) 各個操作的測試與傳統(tǒng)對函數(shù)過程定義的測試各個操作的測試與傳統(tǒng)對函數(shù)過程定義的測試基本相同?;鞠嗤\浖こ誊浖こ?0404) 然后再把測試用例組擴充,針對被測操作調(diào)然后再把測試用例組擴充,針對被測操作調(diào)用對象類中其他操作的情況,設(shè)計操作序列用對象類中其他操作的情況,設(shè)計操作序列的測試用例組。的測試用例組。5) 測試可以覆蓋每個操作的整個輸入域。但這測試可以覆蓋每個操作的整個輸入域。但這不夠,還必須測試這些操作的相互作用,才不夠,還必須測試這

45、些操作的相互作用,才能認為測試是充分的。能認為測試是充分的。6) 各個操作間的相互作用包括各個操作間的相互作用包括類內(nèi)通信類內(nèi)通信和和類間類間通信通信。n設(shè)計對象類的規(guī)格說明測試時的要點:設(shè)計對象類的規(guī)格說明測試時的要點:1) 把對象類當做一個黑盒,確認類的實現(xiàn)是否把對象類當做一個黑盒,確認類的實現(xiàn)是否遵照它的定義。遵照它的定義。軟件工程軟件工程4141putreferencepoint(point)moveto(point)referencepointarea( )draw( )erase( )getreferencepoint(point)displayableshape(point)di

46、splayableshape類內(nèi)消息類內(nèi)消息類間消息類間消息displayableshape( )軟件工程軟件工程4242例如,對于例如,對于“棧?!钡臏y試應當確保的測試應當確保 lifo 原則原則得以實施。得以實施。2) 對于多數(shù)對象類,主要檢驗在類聲明的對于多數(shù)對象類,主要檢驗在類聲明的 public 域域中的那些操作。中的那些操作。3) 對于子類,要檢查繼承父類的對于子類,要檢查繼承父類的public 域域和和protected 域域的那些操作。的那些操作。4) 檢查所有檢查所有public域域,protected域域及及private 域域中中的操作以完全檢查對象中定義的操作。的操作以

47、完全檢查對象中定義的操作。5) 等價劃分的思想也可用到對象類上。將等價劃分的思想也可用到對象類上。將使用對使用對象相同屬性象相同屬性的測試歸入同一個等價劃分集合中。的測試歸入同一個等價劃分集合中。這樣可以建立對對象類屬性進行初始化、這樣可以建立對對象類屬性進行初始化、軟件工程軟件工程4343訪問、更新等的等價劃分。訪問、更新等的等價劃分。在設(shè)計對象類的行為測試時需要注意:在設(shè)計對象類的行為測試時需要注意:1) 基于對象的基于對象的狀態(tài)模型狀態(tài)模型進行測試時,首先要識別進行測試時,首先要識別需要測試的需要測試的狀態(tài)的變遷序列狀態(tài)的變遷序列,并定義事件序列,并定義事件序列來強制執(zhí)行這些變遷。來強制

48、執(zhí)行這些變遷。2) 原則上應當測試每一個狀態(tài)變遷序列,當然這原則上應當測試每一個狀態(tài)變遷序列,當然這樣做測試成本很高。樣做測試成本很高。3) 完全的單元應當保證類的執(zhí)行必須完全的單元應當保證類的執(zhí)行必須覆蓋它的一覆蓋它的一個有代表性的狀態(tài)集合個有代表性的狀態(tài)集合。4) 構(gòu)造函數(shù)和消息序列(線程)的參數(shù)值的選擇構(gòu)造函數(shù)和消息序列(線程)的參數(shù)值的選擇應當滿足這個規(guī)則。應當滿足這個規(guī)則。軟件工程軟件工程44448.3.2 8.3.2 面向?qū)ο蟮募蓽y試面向?qū)ο蟮募蓽y試(oo integrate test)(oo integrate test)n當開發(fā)面向?qū)ο笙到y(tǒng)時,集成的層次并不明顯。而當開發(fā)面

49、向?qū)ο笙到y(tǒng)時,集成的層次并不明顯。而當一組對象類通過組合行為提供一組服務時,則需當一組對象類通過組合行為提供一組服務時,則需將它們一起測試,這就是簇測試。此時不存在自底將它們一起測試,這就是簇測試。此時不存在自底向上和自頂向下的集成。向上和自頂向下的集成。n面向?qū)ο蟪绦蛳嗷フ{(diào)用的功能是散布在程序的不同面向?qū)ο蟪绦蛳嗷フ{(diào)用的功能是散布在程序的不同類中,類通過消息相互作用申請和提供服務。類的類中,類通過消息相互作用申請和提供服務。類的行為與它的狀態(tài)密切相關(guān),狀態(tài)不僅僅是體現(xiàn)在類行為與它的狀態(tài)密切相關(guān),狀態(tài)不僅僅是體現(xiàn)在類數(shù)據(jù)成員的值,也許還包括其他類中的狀態(tài)信息。數(shù)據(jù)成員的值,也許還包括其他類中的

50、狀態(tài)信息。 軟件工程軟件工程4545對象集成測試又稱對象集成測試又稱交互測試交互測試,目的是確保對象的,目的是確保對象的消息傳遞能夠正確進行。消息傳遞能夠正確進行。面向?qū)ο笙到y(tǒng)的集成測試有面向?qū)ο笙到y(tǒng)的集成測試有 3 種可用的方法:種可用的方法:1) 用例或基于場景的測試用例或基于場景的測試 用例或場景描述了對用例或場景描述了對系統(tǒng)的使用模式。測試可以根據(jù)場景描述和對系統(tǒng)的使用模式。測試可以根據(jù)場景描述和對象簇來制定。這種測試象簇來制定。這種測試著眼于系統(tǒng)結(jié)構(gòu),首先著眼于系統(tǒng)結(jié)構(gòu),首先測試幾乎不使用服務器類的獨立類,再測試那測試幾乎不使用服務器類的獨立類,再測試那些使用了獨立類的下一層次的(依

51、賴)類。這些使用了獨立類的下一層次的(依賴)類。這樣一層一層地持續(xù)下去,直到整個系統(tǒng)構(gòu)造完樣一層一層地持續(xù)下去,直到整個系統(tǒng)構(gòu)造完成。成。2) 基于線程的測試基于線程的測試 它把為響應某一系統(tǒng)輸入或它把為響應某一系統(tǒng)輸入或軟件工程軟件工程4646事件所需的一組對象類組裝在一起。每一條線事件所需的一組對象類組裝在一起。每一條線程將分別測試和組裝。因為面向?qū)ο笙到y(tǒng)通常程將分別測試和組裝。因為面向?qū)ο笙到y(tǒng)通常是事件驅(qū)動的,因此這是一個特別合適的測試是事件驅(qū)動的,因此這是一個特別合適的測試形式。形式。3) 對象交互測試對象交互測試 這個方法提出了集成測試的中這個方法提出了集成測試的中間層概念。中間層給

52、出叫做間層概念。中間層給出叫做 “方法方法- -消息消息”路路徑的對象交互序列。所謂徑的對象交互序列。所謂“原子系統(tǒng)功能原子系統(tǒng)功能”就就是指一些輸入事件加上一條是指一些輸入事件加上一條“方法方法- -消息消息”路路徑,終止于一個輸出事件。徑,終止于一個輸出事件。n集成測試能夠檢測出相對獨立的單元測試無法檢集成測試能夠檢測出相對獨立的單元測試無法檢測出的那些類相互作用時才會產(chǎn)生的錯誤。測出的那些類相互作用時才會產(chǎn)生的錯誤。軟件工程軟件工程4747n集成測試只關(guān)注于系統(tǒng)的結(jié)構(gòu)和內(nèi)部的相互作用。集成測試只關(guān)注于系統(tǒng)的結(jié)構(gòu)和內(nèi)部的相互作用。面向?qū)ο蟮募蓽y試可以分成兩步進行:先進行靜面向?qū)ο蟮募蓽y

53、試可以分成兩步進行:先進行靜態(tài)測試,再進行動態(tài)測試。態(tài)測試,再進行動態(tài)測試。1) 靜態(tài)測試靜態(tài)測試 靜態(tài)測試主要針對程序的結(jié)構(gòu)進行,檢測程序靜態(tài)測試主要針對程序的結(jié)構(gòu)進行,檢測程序結(jié)構(gòu)是否符合設(shè)計要求。現(xiàn)在流行的一些測試結(jié)構(gòu)是否符合設(shè)計要求?,F(xiàn)在流行的一些測試軟件都能提供一種稱為軟件都能提供一種稱為“可逆性工程可逆性工程”的功能,的功能,即即通過源程序得到類關(guān)系圖和函數(shù)功能調(diào)用關(guān)通過源程序得到類關(guān)系圖和函數(shù)功能調(diào)用關(guān)系圖系圖。如。如international software automation公公司的司的panorama-2 for windows95、rational公司公司的的rose

54、 c+ analyzer等。等。軟件工程軟件工程4848 將將“可逆性工程可逆性工程”得到的結(jié)果與得到的結(jié)果與ood的結(jié)果相的結(jié)果相比較,檢測程序結(jié)構(gòu)和實現(xiàn)上是否有缺陷。換比較,檢測程序結(jié)構(gòu)和實現(xiàn)上是否有缺陷。換句話說,通過這種方法檢測句話說,通過這種方法檢測oop是否達到了設(shè)是否達到了設(shè)計要求。計要求。2) 動態(tài)動態(tài)測試測試 動態(tài)測試在設(shè)計測試用例時,通常需要上述的動態(tài)測試在設(shè)計測試用例時,通常需要上述的功能調(diào)用結(jié)構(gòu)圖、類關(guān)系圖或者實體關(guān)系圖為功能調(diào)用結(jié)構(gòu)圖、類關(guān)系圖或者實體關(guān)系圖為參考,確定不需要被重復測試的部分,從而優(yōu)參考,確定不需要被重復測試的部分,從而優(yōu)化測試用例,減少測試工作量,使

55、得進行的測化測試用例,減少測試工作量,使得進行的測試能夠達到一定覆蓋標準。試能夠達到一定覆蓋標準。 測試所要達到的覆蓋標準可以是:測試所要達到的覆蓋標準可以是: 軟件工程軟件工程4949 達到類所有的服務要求或服務提供的一定覆達到類所有的服務要求或服務提供的一定覆蓋率;蓋率; 依據(jù)類間傳遞的消息,達到對所有執(zhí)行線程依據(jù)類間傳遞的消息,達到對所有執(zhí)行線程的一定覆蓋率;的一定覆蓋率; 達到類的所有狀態(tài)的一定覆蓋率等。達到類的所有狀態(tài)的一定覆蓋率等。 考慮使用現(xiàn)有的一些測試工具來得到程序代考慮使用現(xiàn)有的一些測試工具來得到程序代碼執(zhí)行的覆蓋率。碼執(zhí)行的覆蓋率。 n具體設(shè)計測試用例,可參考下列步驟:具體

56、設(shè)計測試用例,可參考下列步驟:a) 先選定檢測的類;參考先選定檢測的類;參考ood分析結(jié)果,仔細列分析結(jié)果,仔細列出類的狀態(tài)和相應的行為、類或成員函數(shù)間傳出類的狀態(tài)和相應的行為、類或成員函數(shù)間傳遞的消息、輸入或輸出的界定等。遞的消息、輸入或輸出的界定等。 軟件工程軟件工程5050b) 確定覆蓋標準。確定覆蓋標準。c) 利用結(jié)構(gòu)關(guān)系圖確定待測試類的所有關(guān)聯(lián)。利用結(jié)構(gòu)關(guān)系圖確定待測試類的所有關(guān)聯(lián)。d) 根據(jù)程序中類的對象構(gòu)造測試用例,確認使用根據(jù)程序中類的對象構(gòu)造測試用例,確認使用什么輸入激發(fā)類的狀態(tài)、使用類的服務和期望什么輸入激發(fā)類的狀態(tài)、使用類的服務和期望產(chǎn)生什么行為等。產(chǎn)生什么行為等。n注意

57、,設(shè)計測試用例時,不但要設(shè)計確認類功能注意,設(shè)計測試用例時,不但要設(shè)計確認類功能能夠成功執(zhí)行的輸入,還應該有意識的設(shè)計一些能夠成功執(zhí)行的輸入,還應該有意識的設(shè)計一些會導致異常的輸入,確認類是否有不合法的行為會導致異常的輸入,確認類是否有不合法的行為產(chǎn)生,如發(fā)送與類狀態(tài)不相適應的消息,要求不產(chǎn)生,如發(fā)送與類狀態(tài)不相適應的消息,要求不相適應的服務等。根據(jù)具體情況,動態(tài)的集成測相適應的服務等。根據(jù)具體情況,動態(tài)的集成測試,有時也可以通過系統(tǒng)測試完成。試,有時也可以通過系統(tǒng)測試完成。 軟件工程軟件工程51518.3.3 8.3.3 面向?qū)ο蟮南到y(tǒng)測試面向?qū)ο蟮南到y(tǒng)測試(oo system test)(

58、oo system test) 通過單元測試和集成測試,僅能保證軟件開發(fā)的功通過單元測試和集成測試,僅能保證軟件開發(fā)的功能得以實現(xiàn)。但不能確認在實際運行時,它是否滿能得以實現(xiàn)。但不能確認在實際運行時,它是否滿足用戶的需要,是否大量存在實際使用條件下會被足用戶的需要,是否大量存在實際使用條件下會被誘發(fā)產(chǎn)生錯誤的隱患。為此,對完成開發(fā)的軟件必誘發(fā)產(chǎn)生錯誤的隱患。為此,對完成開發(fā)的軟件必須經(jīng)過規(guī)范的系統(tǒng)測試。須經(jīng)過規(guī)范的系統(tǒng)測試。 換個角度說,開發(fā)完成的軟件僅僅是實際投入使用換個角度說,開發(fā)完成的軟件僅僅是實際投入使用系統(tǒng)的一個組成部分,需要測試它與系統(tǒng)其他部分系統(tǒng)的一個組成部分,需要測試它與系統(tǒng)其

59、他部分配套運行的表現(xiàn),以保證在系統(tǒng)各部分協(xié)調(diào)工作的配套運行的表現(xiàn),以保證在系統(tǒng)各部分協(xié)調(diào)工作的環(huán)境下也能正常工作。環(huán)境下也能正常工作。 軟件工程軟件工程5252 在系統(tǒng)測試的層次上,不再考慮對象類間相互連接在系統(tǒng)測試的層次上,不再考慮對象類間相互連接的細節(jié)。主要著眼于用戶可見的動作和用戶可識別的細節(jié)。主要著眼于用戶可見的動作和用戶可識別的系統(tǒng)輸出。的系統(tǒng)輸出。 為了幫助系統(tǒng)測試的執(zhí)行,測試者需要回到分析時為了幫助系統(tǒng)測試的執(zhí)行,測試者需要回到分析時的動態(tài)模型和描述系統(tǒng)行為的事件序列(腳本)進的動態(tài)模型和描述系統(tǒng)行為的事件序列(腳本)進行測試。行測試。 可以利用黑盒測試的方法來驅(qū)動系統(tǒng)測試??梢?/p>

60、利用黑盒測試的方法來驅(qū)動系統(tǒng)測試。測試檢測試檢測軟件中的故障并確定軟件是否執(zhí)行了預定要開發(fā)測軟件中的故障并確定軟件是否執(zhí)行了預定要開發(fā)的功能。的功能。 系統(tǒng)測試應該盡量搭建與用戶實際使用環(huán)境相同的系統(tǒng)測試應該盡量搭建與用戶實際使用環(huán)境相同的測試平臺,應該保證被測系統(tǒng)的完整性。測試平臺,應該保證被測系統(tǒng)的完整性。對沒有的對沒有的軟件工程軟件工程5353系統(tǒng)設(shè)備部件,應有相應的模擬手段。系統(tǒng)設(shè)備部件,應有相應的模擬手段。n具體測試內(nèi)容包括:具體測試內(nèi)容包括:a) 功能測試:功能測試:測試系統(tǒng)是否滿足開發(fā)要求,是否測試系統(tǒng)是否滿足開發(fā)要求,是否能夠滿足設(shè)計所描述的功能,是否用戶的需求能夠滿足設(shè)計所描述的功能

溫馨提示

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

最新文檔

評論

0/150

提交評論