第5章面向?qū)ο筌浖臏y試1_第1頁
第5章面向?qū)ο筌浖臏y試1_第2頁
第5章面向?qū)ο筌浖臏y試1_第3頁
第5章面向?qū)ο筌浖臏y試1_第4頁
第5章面向?qū)ο筌浖臏y試1_第5頁
已閱讀5頁,還剩84頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、面向?qū)ο蟮臏y試概述面向?qū)ο蟮臏y試概述面向面向?qū)ο蟮南蟮膯螁卧獪y試測試面向面向?qū)ο蟮募上蟮募蓽y試測試和系和系統(tǒng)測試統(tǒng)測試1.2.1 類與對象類與對象1. 對象的基本概念對象的基本概念對象對象: : 用來描述客觀事物的一個實體,它是構(gòu)成用來描述客觀事物的一個實體,它是構(gòu)成系統(tǒng)的一個基本單元。一個對象具有一組屬性和行。系統(tǒng)的一個基本單元。一個對象具有一組屬性和行。實體對象實體對象 一臺計算機一臺計算機抽象對象抽象對象 一項計劃一項計劃對象構(gòu)成要素對象構(gòu)成要素: : 1.1.對象標(biāo)識符:是對象的名稱,用來區(qū)別與其他對象。對象標(biāo)識符:是對象的名稱,用來區(qū)別與其他對象。 2.2.屬性屬性: :

2、是用來描述對象靜態(tài)特征的一個數(shù)據(jù)項。是用來描述對象靜態(tài)特征的一個數(shù)據(jù)項。 3.3.行為行為: : 是用來描述對象動態(tài)特征和行為的一個操作。是用來描述對象動態(tài)特征和行為的一個操作。 對象示例對象示例1:一個:一個“學(xué)生學(xué)生”對象的例子對象的例子 對象名對象名:學(xué)生:學(xué)生 對象的屬性對象的屬性: 學(xué)號:學(xué)號:123456 姓名:令狐沖姓名:令狐沖 年齡:年齡:18 專業(yè):信管專業(yè):信管 行為行為 修改學(xué)號、姓名、專業(yè)、年齡等等修改學(xué)號、姓名、專業(yè)、年齡等等1.2.1 類與對象類與對象 對象示例對象示例2:一個:一個“課程課程”對象的例子:對象的例子: 對象名對象名:課程:課程 對象的屬性對象的屬性

3、: 課程號:課程號:123456 課程名:程序設(shè)計課程名:程序設(shè)計 任課教師:莫名任課教師:莫名 選課要求:選課要求: 學(xué)時:學(xué)時:48 行為行為 獲取并修改課程名、課程號、學(xué)時數(shù)、選課要求、獲取并修改課程名、課程號、學(xué)時數(shù)、選課要求、任課教師等任課教師等1.2.1 類與對象類與對象2. 類的基本概念類的基本概念 類類 :是具有相同屬性和行為的一組對象的集合是具有相同屬性和行為的一組對象的集合,它為它為屬于該類的全部對象提供統(tǒng)一的的抽象描述屬于該類的全部對象提供統(tǒng)一的的抽象描述 類和對象的關(guān)系類和對象的關(guān)系:類:類 對象對象 抽象定義抽象定義 實例實例 類類 對象舉例對象舉例 學(xué)生學(xué)生 學(xué)生王

4、強學(xué)生王強 課程課程 C+程序設(shè)計程序設(shè)計 類型類型 變量變量, 如如 C 語言中的語言中的 int 和和 int x; 類的實例類的實例用類定義的類變量,即對象。類是對多個特性相用類定義的類變量,即對象。類是對多個特性相同的對象實例的抽象,所以同一類的不同實例之間必有:同的對象實例的抽象,所以同一類的不同實例之間必有: 相同的操作集合相同的操作集合 相同的屬性集合相同的屬性集合 不同的對象名,分配有不同的存儲空間。不同的對象名,分配有不同的存儲空間。1.2.1 類與對象類與對象3、類的確定與劃分類的確定與劃分 類的確定類的確定對所遇到的對象進行分析、歸納,根對所遇到的對象進行分析、歸納,根據(jù)

5、共同的特征來確定一個類。據(jù)共同的特征來確定一個類。 類的確定的方法:類的確定的方法: 判斷是否有一個以上的實例判斷是否有一個以上的實例 判斷類的實例中是否有絕對的不同點判斷類的實例中是否有絕對的不同點 類的劃分不是絕對的,可以根據(jù)不同的實際需要確類的劃分不是絕對的,可以根據(jù)不同的實際需要確定不同的類定不同的類1.2.1 類與對象類與對象1.2.1 類與對象類與對象4、類的描述類的描述 類的描述類的描述不同的不同的OOP語言用不同的描述形式。在語言用不同的描述形式。在C+中用關(guān)鍵字中用關(guān)鍵字class來定義描述一個類。來定義描述一個類。class classnamepublic:/public

6、members/friend function prototypesprivate:/private members;1.2.2抽象與封裝抽象與封裝 1、封裝性封裝性 封裝封裝encapsulation將數(shù)據(jù)和與這個數(shù)據(jù)有關(guān)的操作將數(shù)據(jù)和與這個數(shù)據(jù)有關(guān)的操作集合在一起集合在一起, ,形成一個實體形成一個實體對象,且盡可能隱藏對象的內(nèi)部對象,且盡可能隱藏對象的內(nèi)部細(xì)節(jié)細(xì)節(jié)特點特點: : 具有一個清楚的邊界具有一個清楚的邊界, ,對象的所有私有數(shù)據(jù)、內(nèi)部對象的所有私有數(shù)據(jù)、內(nèi)部程序(成員函數(shù))細(xì)節(jié)都被固定在這個邊界內(nèi)。程序(成員函數(shù))細(xì)節(jié)都被固定在這個邊界內(nèi)。 具有一個接口,描述了對象之間的相互作

7、用、請具有一個接口,描述了對象之間的相互作用、請求和響應(yīng)求和響應(yīng)消息消息 對象內(nèi)部的實現(xiàn)代碼受到封裝殼的保護,其它對對象內(nèi)部的實現(xiàn)代碼受到封裝殼的保護,其它對象不能直接修改本對象所擁有的數(shù)據(jù)和代碼。象不能直接修改本對象所擁有的數(shù)據(jù)和代碼。 封裝的單位是對象。封裝的單位是對象。2、封裝性、封裝性 從外面看只能看到對象的外部特性,即能夠受理哪些信息,具從外面看只能看到對象的外部特性,即能夠受理哪些信息,具有哪些處理能力;對象的內(nèi)部,即處理能力的實行和內(nèi)部狀態(tài),有哪些處理能力;對象的內(nèi)部,即處理能力的實行和內(nèi)部狀態(tài),對外是不可見的。對外是不可見的。 從外面不能直接使用對象的處理能力,也不能直接修改其

8、內(nèi)部從外面不能直接使用對象的處理能力,也不能直接修改其內(nèi)部狀態(tài),對象的內(nèi)部狀態(tài)只能由其自身改變。狀態(tài),對象的內(nèi)部狀態(tài)只能由其自身改變。 封裝的優(yōu)點:封裝的優(yōu)點:1.降低部件間的耦合度,提高部件的獨立性降低部件間的耦合度,提高部件的獨立性2.具有隱藏性和安全性具有隱藏性和安全性 (如銀行的帳戶如銀行的帳戶)3.易于維護易于維護(由于數(shù)據(jù)獨立由于數(shù)據(jù)獨立,易于發(fā)現(xiàn)問題易于發(fā)現(xiàn)問題) 4.封裝將對象的使用者與設(shè)計者分開封裝將對象的使用者與設(shè)計者分開,使用者只需要通過接口訪問使用者只需要通過接口訪問對象對象,不必須了解對象的內(nèi)部細(xì)節(jié)不必須了解對象的內(nèi)部細(xì)節(jié).提高了軟件復(fù)用提高了軟件復(fù)用. 封裝的缺點:

9、封裝的缺點: 需要更多的輸入輸出函數(shù)。需要更多的輸入輸出函數(shù)。 1.2.2抽象與封裝抽象與封裝3、封裝的形式class classnamepublic:/public members/friend functionprivate:/private members;Public 成員成員1Public 成員成員2Public 成員成員nPrivate一個一個Class定義了一種抽定義了一種抽象的數(shù)據(jù)類型象的數(shù)據(jù)類型,用戶只能用戶只能訪問訪問Public成員成員,不能直接不能直接訪問訪問Private成員成員直接訪問直接訪問private是是禁止的禁止的邊邊界界1.2.2抽象與封裝抽象與封裝1、抽

10、象、抽象抽象(抽象(abstract)是指有意忽略問題的某些細(xì))是指有意忽略問題的某些細(xì)節(jié)和與當(dāng)前目標(biāo)無關(guān)的方面,以便把問題的本節(jié)和與當(dāng)前目標(biāo)無關(guān)的方面,以便把問題的本質(zhì)表達得更清楚。質(zhì)表達得更清楚。 封裝就是將類的屬性包裝起來,不讓外封裝就是將類的屬性包裝起來,不讓外界輕易的知道他的內(nèi)部實現(xiàn)。只提供給界輕易的知道他的內(nèi)部實現(xiàn)。只提供給你對外的接口讓你來調(diào)用。好處可以增你對外的接口讓你來調(diào)用。好處可以增強模塊的獨立性。強模塊的獨立性。抽象抽象=你可以這樣來想,抽象就是一個你可以這樣來想,抽象就是一個類的最基礎(chǔ)的東西,比方說人,他的抽類的最基礎(chǔ)的東西,比方說人,他的抽象類可能就是能直立行走,能勞

11、動,但象類可能就是能直立行走,能勞動,但具體到你是黑人,白人,還得黑人類,具體到你是黑人,白人,還得黑人類,白人類來說明白人類來說明繼承就是從父類把它的有用的東西拿過繼承就是從父類把它的有用的東西拿過來自己用,不用在自己去實現(xiàn)了,向母來自己用,不用在自己去實現(xiàn)了,向母親會把雙眼皮傳給女兒,不用她自己去親會把雙眼皮傳給女兒,不用她自己去割了割了多態(tài)體現(xiàn)在重載,相同的方法名。不同多態(tài)體現(xiàn)在重載,相同的方法名。不同的實現(xiàn)機制,當(dāng)程序運行過程中自己去的實現(xiàn)機制,當(dāng)程序運行過程中自己去判斷到底該調(diào)用誰判斷到底該調(diào)用誰比方說打人,那么多人,當(dāng)你打起群架比方說打人,那么多人,當(dāng)你打起群架來,該打誰就打誰,事

12、前你也不知道來,該打誰就打誰,事前你也不知道1.2.2抽象與封裝抽象與封裝4、抽象與封裝形成了程序接口與實現(xiàn)的分離、抽象與封裝形成了程序接口與實現(xiàn)的分離 1、繼承的基本概念、繼承的基本概念古語:古語:龍生龍,鳳生鳳,老鼠生兒會打龍生龍,鳳生鳳,老鼠生兒會打洞洞繼承:對象類之間的相交關(guān)系繼承:對象類之間的相交關(guān)系, ,使得某類對象可使得某類對象可以繼承另外一類對象的特征和功能以繼承另外一類對象的特征和功能類間具有繼承關(guān)系的特性類間具有繼承關(guān)系的特性: : 類間具有共享特征類間具有共享特征( (包括數(shù)據(jù)和程序代碼的共享包括數(shù)據(jù)和程序代碼的共享) ):遺:遺傳傳 類間具有細(xì)微差別或新增部分類間具有細(xì)

13、微差別或新增部分( (包括非共享的程序代包括非共享的程序代碼和數(shù)據(jù)碼和數(shù)據(jù)) ):變異:變異 類間具有層次結(jié)構(gòu)(類間具有層次結(jié)構(gòu)(如同人類通過繼承構(gòu)成了家簇關(guān)如同人類通過繼承構(gòu)成了家簇關(guān)系一樣系一樣)1.2.3繼承繼承2、繼承分類、繼承分類 從繼承源上劃分:單繼承(一個派生類只有一個基類)、從繼承源上劃分:單繼承(一個派生類只有一個基類)、多繼承(一個派生類有多個基類)多繼承(一個派生類有多個基類) 從繼承內(nèi)容上劃分:取代繼承、包含繼承、受限繼承、從繼承內(nèi)容上劃分:取代繼承、包含繼承、受限繼承、特化繼承。特化繼承。3 3、繼承的作用、繼承的作用: : 實現(xiàn)軟件的可重用性實現(xiàn)軟件的可重用性 實現(xiàn)

14、軟件的獨立性實現(xiàn)軟件的獨立性 增加軟件的可維護性增加軟件的可維護性1.2.3繼承繼承4 4、繼承的層次結(jié)構(gòu)、繼承的層次結(jié)構(gòu)思考:和具有哪些成員?思考:和具有哪些成員?ABECD a: int getA( ): int c: int getC( ): int setB( ): void b: int getB( ): int setB( ): voidinheritance(“is-a” relation) e: int getE( ): intsetB( ): void d: intgetD( ): int1.2.3繼承繼承5、繼承與封裝的關(guān)系、繼承與封裝的關(guān)系 封裝是指對象的的封裝,在對象中

15、數(shù)據(jù)和操作總是封裝是指對象的的封裝,在對象中數(shù)據(jù)和操作總是包裹在一起的,包裹在一起的,繼承不會影響對象的這種封裝性繼承不會影響對象的這種封裝性,但無限制的派生繼承會在一定程度上損害對象中數(shù)但無限制的派生繼承會在一定程度上損害對象中數(shù)據(jù)的隱蔽性。據(jù)的隱蔽性。 封裝使類定義中實現(xiàn)的代碼可以用于該類的各個實封裝使類定義中實現(xiàn)的代碼可以用于該類的各個實例(對象)中,例(對象)中,實現(xiàn)了動態(tài)共享代碼實現(xiàn)了動態(tài)共享代碼;繼承使用派;繼承使用派生類能與基類共享基類中實現(xiàn)的代碼,生類能與基類共享基類中實現(xiàn)的代碼,實現(xiàn)了靜態(tài)實現(xiàn)了靜態(tài)共享代碼共享代碼。6、類的層次、類的層次 由一個類可以派生出任意多個派生類,這

16、樣就形成由一個類可以派生出任意多個派生類,這樣就形成了類的層次關(guān)系,這是現(xiàn)實世界中事物的分類問題了類的層次關(guān)系,這是現(xiàn)實世界中事物的分類問題在計算機中的解形式。在計算機中的解形式。1.2.3繼承繼承7、繼承的優(yōu)勢、繼承的優(yōu)勢 能清晰體現(xiàn)相關(guān)類間的層次結(jié)構(gòu)關(guān)系。能清晰體現(xiàn)相關(guān)類間的層次結(jié)構(gòu)關(guān)系。 有效地址提高了程序的可重用性,減小了程序代碼的冗余度。有效地址提高了程序的可重用性,減小了程序代碼的冗余度。 增強了程序的一致性,減少了程序模塊間的接口和界面,使程序增強了程序的一致性,減少了程序模塊間的接口和界面,使程序更易維護。更易維護。 繼承是自動傳播程序代碼的有力工具。繼承是自動傳播程序代碼的有

17、力工具。 繼承是新類構(gòu)造、建立和擴充的有效手段。繼承是新類構(gòu)造、建立和擴充的有效手段。 繼承具有傳遞性繼承具有傳遞性 如果類如果類C繼承類繼承類B,類,類B繼承類繼承類A,則類,則類C繼承類繼承類A “站在巨人的肩頭上站在巨人的肩頭上”。用戶在開發(fā)新系統(tǒng)時不必從零開始,可。用戶在開發(fā)新系統(tǒng)時不必從零開始,可以繼承原有相似功能或者從類庫中選取需要的類,再派生新類。以繼承原有相似功能或者從類庫中選取需要的類,再派生新類。1.2.3繼承繼承例例1:車輛的繼承關(guān)系:車輛的繼承關(guān)系車輛車輛非機動車非機動車客車客車 卡車卡車 轎車轎車機動車機動車?yán)?:人類按職業(yè)劃分的一種繼承關(guān)系:人類按職業(yè)劃分的一種繼

18、承關(guān)系人人學(xué)生學(xué)生工人工人教師教師農(nóng)民農(nóng)民中學(xué)中學(xué)生生大學(xué)大學(xué)生生研究生研究生講師講師教授教授1.2.3繼承繼承8、兩個繼承的案例、兩個繼承的案例1、多態(tài)、多態(tài)polymorphism 對象根據(jù)所接受的消息而做出動作,同樣的消息為對象根據(jù)所接受的消息而做出動作,同樣的消息為不同的對象接受時可導(dǎo)致完全不同的行動,該現(xiàn)象不同的對象接受時可導(dǎo)致完全不同的行動,該現(xiàn)象稱為多態(tài)性。稱為多態(tài)性。 簡單的說:單接口,多實現(xiàn)簡單的說:單接口,多實現(xiàn) 舉例:舉例:sqrt_i (int i),sqrt_f (float f)sqrt (int i),sqrt (float f) 作用作用: 減輕程序員負(fù)擔(dān)減輕程

19、序員負(fù)擔(dān) 降低程序員出錯機率降低程序員出錯機率1.2.4 多態(tài)多態(tài)2、多態(tài)性的實現(xiàn)、多態(tài)性的實現(xiàn) 運行時多態(tài)性:虛函數(shù)運行時多態(tài)性:虛函數(shù) 編譯時多態(tài)性:重載編譯時多態(tài)性:重載 重載重載 函數(shù)重載:函數(shù)重載:是指在同一作用域內(nèi)的若干個參數(shù)特征不是指在同一作用域內(nèi)的若干個參數(shù)特征不同的函數(shù)可以使用相同的函數(shù)名字同的函數(shù)可以使用相同的函數(shù)名字。 運算符重載:運算符重載:是指同一個運算符可以施加于不同類型是指同一個運算符可以施加于不同類型的操作數(shù)上面。的操作數(shù)上面。 優(yōu)點:優(yōu)點:重載進一步提高了面向?qū)ο笙到y(tǒng)的靈活性和可重載進一步提高了面向?qū)ο笙到y(tǒng)的靈活性和可讀性讀性1.2.4 多態(tài)多態(tài)3、多態(tài)的一個

20、案例、多態(tài)的一個案例圖中同名函數(shù)圖中同名函數(shù)area( )作用在作用在Circle、Triangle等不同類上時,將執(zhí)等不同類上時,將執(zhí)行不同的操作,這就是多態(tài)。行不同的操作,這就是多態(tài)。1.2.4 多態(tài)多態(tài)1、面向過程程序設(shè)計的基本特點、面向過程程序設(shè)計的基本特點按層次組織模塊。按層次組織模塊。每一模塊只有一個入口,一個出口。每一模塊只有一個入口,一個出口。代碼和數(shù)據(jù)分離,即程序代碼和數(shù)據(jù)分離,即程序=數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)+算法。算法。 方法:自頂向下,逐步求精,模塊化方法:自頂向下,逐步求精,模塊化1.面向?qū)ο竺嫦驅(qū)ο笈c面向過程程序設(shè)計與面向過程程序設(shè)計2、面向?qū)ο蟪绦蛟O(shè)計、面向?qū)ο蟪绦蛟O(shè)計

21、它將數(shù)據(jù)和操作數(shù)據(jù)的過程(函數(shù))綁在一它將數(shù)據(jù)和操作數(shù)據(jù)的過程(函數(shù))綁在一起,形成一個相互依存、不可分離的整體起,形成一個相互依存、不可分離的整體(即對象),從同類對象中抽象出共性,形(即對象),從同類對象中抽象出共性,形成類。成類。 同類對象中的數(shù)據(jù)原則上只能用本類提供的同類對象中的數(shù)據(jù)原則上只能用本類提供的方法(成員函數(shù))進行處理。類通過封裝將方法(成員函數(shù))進行處理。類通過封裝將接口與實現(xiàn)分離開來,通過接口與外界聯(lián)系。接口與實現(xiàn)分離開來,通過接口與外界聯(lián)系。對象之間通過消息進行通信。對象之間通過消息進行通信。 1.面向?qū)ο竺嫦驅(qū)ο笈c面向過程程序設(shè)計與面向過程程序設(shè)計3、兩種程序方法的對

22、比、兩種程序方法的對比1.面向?qū)ο竺嫦驅(qū)ο笈c面向過程程序設(shè)計與面向過程程序設(shè)計面向?qū)ο蟪绦蛟O(shè)計將數(shù)面向?qū)ο蟪绦蛟O(shè)計將數(shù)據(jù)和操作數(shù)據(jù)的程序代據(jù)和操作數(shù)據(jù)的程序代碼綁在一起構(gòu)成對象具碼綁在一起構(gòu)成對象具有更好的可維護性,因有更好的可維護性,因某類對象數(shù)據(jù)的改變只某類對象數(shù)據(jù)的改變只會引起該類對象操作代會引起該類對象操作代碼的改變,而與其他類碼的改變,而與其他類型的對象無關(guān),這就把型的對象無關(guān),這就把程序代碼的修改維護局程序代碼的修改維護局限在一個很小的范圍內(nèi)。限在一個很小的范圍內(nèi)。 3、兩種程序方法的對比、兩種程序方法的對比1.面向?qū)ο竺嫦驅(qū)ο笈c面向過程程序設(shè)計與面向過程程序設(shè)計面向?qū)ο蟪绦蛟O(shè)計將

23、數(shù)面向?qū)ο蟪绦蛟O(shè)計將數(shù)據(jù)和操作數(shù)據(jù)的程序代據(jù)和操作數(shù)據(jù)的程序代碼綁在一起構(gòu)成對象具碼綁在一起構(gòu)成對象具有更好的可維護性,因有更好的可維護性,因某類對象數(shù)據(jù)的改變只某類對象數(shù)據(jù)的改變只會引起該類對象操作代會引起該類對象操作代碼的改變,而與其他類碼的改變,而與其他類型的對象無關(guān),這就把型的對象無關(guān),這就把程序代碼的修改維護局程序代碼的修改維護局限在一個很小的范圍內(nèi)。限在一個很小的范圍內(nèi)。 面向?qū)ο蟮能浖_發(fā)可分為面向?qū)ο蟮姆治觯∣bject Oriented Analysis,OOA)、面向?qū)ο蟮脑O(shè)計(Object Oriented Design,OOD)和面向?qū)ο蟮木幊蹋∣bject Orien

24、ted Progamming,OOP)三部分,后面將對這些模型、分析和設(shè)計進行討論。 1面向?qū)ο蟮姆治?面向?qū)ο蟮姆治觯∣bject Oriented Analysis,OOA),是采用面向?qū)ο笏悸愤M行需求分析建模的工程。也就是以需求分析為基礎(chǔ),來選擇對象和類的過程。分析的步驟包括以下幾點。(1)獲取功能需求 這一步驟的主要工作是確定系統(tǒng)軟件的參與者(actor),這些參與者代表了使用該系統(tǒng)軟件的不同角色。然后根據(jù)參與者,確定系統(tǒng)軟件所需要的主要功能。(2)根據(jù)功能和參與者確定系統(tǒng)的類和對象 在面向?qū)ο蟮拈_發(fā)中,系統(tǒng)功能的實現(xiàn)都是通過對對象的操作來完成的,而對象是通過類實例化以后得到的,因此,

25、在獲得功能需求以后,首先要考慮的就是需要定義哪些類,才能滿足系統(tǒng)的功能需求(3)動作對象 動作對象是一種主動對象,它通過生成或者使用數(shù)據(jù)值來驅(qū)動數(shù)據(jù)流圖。(4)數(shù)據(jù)存儲對象 數(shù)據(jù)流圖中的數(shù)據(jù)存儲是被動對象,它用來存儲數(shù)據(jù)。 這三種模型分別從三個不同的方面對所要開發(fā)的系統(tǒng)進行了描述,功能模型指明了系統(tǒng)應(yīng)該“做什么”;動態(tài)模型明確規(guī)定了什么時候(即在何種狀態(tài)下)接受了什么事件的觸發(fā);對象模型則定義了做事情的實體。因此在面向?qū)ο蠓椒▽W(xué)中,對象模型是最基本最重要的,它為其他兩種模型奠定了基礎(chǔ)。我們依靠對象模型完成三種模型的集成。 5.1.5 面向?qū)ο筌浖臏y試策略面向?qū)ο筌浖臏y試策略 在面向?qū)ο筌浖?/p>

26、的設(shè)計和開發(fā)中,說到底就是對類的設(shè)計和開發(fā)。因為面向?qū)ο筌浖墓δ艿膶崿F(xiàn),是由類通過消息傳遞來完成的。因此,面向?qū)ο蟮膯卧獪y試,實際就是對類的測試。通過前面的測試策略介紹,類測試內(nèi)容包括:基于服務(wù)的測試、基于狀態(tài)的測試、基于響應(yīng)狀態(tài)的測試,本文將著重介紹前兩種類測試技術(shù)。 BBD五元組可寫為f=(Du,Dd,P,F(xiàn)e,G),其中:Du=di| dif 引用的全局?jǐn)?shù)據(jù)或類數(shù)據(jù);Dd=di| dif修改了全局?jǐn)?shù)據(jù)或類數(shù)據(jù);P=Xll,X22,Xnn,Xn+1n+1f的參數(shù)表和函數(shù)返回值,i為(表示輸入)、(表示輸出)、(表示輸入/輸出),若Xn+1缺省,則無返回值;Fe=Fi| Fi被f 調(diào)用的其

27、他服務(wù);G是一個有向圖,叫塊體,它是按照控制流圖的思想修改f的程序流程圖而來的,表示f的控制結(jié)構(gòu),f中的復(fù)合條件判斷被分解,每個判斷框只有單個的條件。5.2.1 基于服務(wù)的類測試技術(shù)基于服務(wù)的類測試技術(shù) 基于服務(wù)的類測試主要考察封裝在類中的一個方法對數(shù)據(jù)進行的操作。它可以采用傳統(tǒng)的白盒測試方法,如:基路徑法、插樁法、邊界值法、排錯法、等價類法等。但由于受面向?qū)ο筌浖y試技術(shù)發(fā)展水平等方面因素的限制,測試人員在選擇測試用例時往往都是根據(jù)直覺和經(jīng)驗來進行,給測試帶來很大的盲目性;同時由于測試人員的個性及傾向性也使得選擇的測試用例僅能測試出其所熟悉的某一方面的錯誤,許多隱含的其他錯誤不能被檢測出來,

28、這在無形中降低了軟件的可靠性。為克服軟件測試的盲目性和局限性,保證測試的質(zhì)量,提高軟件的可靠性,我們提出采用Kung提出的塊分支圖法。 1基于服務(wù)的類測試策略基于服務(wù)的類測試策略由此得到的BBD圖如圖5-2所示,借助BBD即可對類進行測試。2測試實例一測試實例一下面用JAVA設(shè)計一個類Rectangle,要求如下。(1)類中的私有變量存放Rectangle的長和寬,并且設(shè)置它們的默認(rèn)值為1;(2)通過成員函數(shù)設(shè)置其長和寬,并確保長和寬都在(0,50)范圍之內(nèi);(3)求周長Perimeter。其程序如下:對于以上類Rectangle中Set服務(wù)的BBD圖如圖5-3所示 圖5-3 類Rectang

29、le中Set服務(wù)的BBD圖圖5-4 類Rectangle的服務(wù)Set的控制流圖圖5-4 類Rectangle的服務(wù)Set的控制流圖基本路徑集要確保程序中每個可執(zhí)行語句至少執(zhí)行一次。在圖5-4所示的控制流圖中,一組獨立的路徑是:path1:-;path2:-;path3:-。基本路徑集要確保程序中每個可執(zhí)行語句至少執(zhí)行一次。在圖5-4所示的控制流圖中,一組獨立的路徑是:path1:-;path2:-;path3:-。根據(jù)判斷給出的條件,選擇適當(dāng)?shù)臄?shù)據(jù)以保證每一條基本路徑均被測試到。只要設(shè)計出的測試用例能夠保證這些路徑的執(zhí)行,就可以使得程序中的每個可執(zhí)行語句至少執(zhí)行一次,每個條件的分支也能得到測試

30、。根據(jù)判斷給出的條件,選擇適當(dāng)?shù)臄?shù)據(jù)以保證每一條基本路徑均被測試到。只要設(shè)計出的測試用例能夠保證這些路徑的執(zhí)行,就可以使得程序中的每個可執(zhí)行語句至少執(zhí)行一次,每個條件的分支也能得到測試。5.2.2 基于狀態(tài)的類測試技術(shù)基于狀態(tài)的類測試技術(shù) 0SD(0bject State Diagram)模型即對象狀態(tài)圖模型,是用于測試對象狀態(tài)行為的測試模型,描述了對象在其生命周期中的所有狀態(tài)及其狀態(tài)之間的相互轉(zhuǎn)移。OSD模型由若干個AOSD模型組成,AOSD為一個四元組:AOSD=(S,d,S,So),其中S表示一個對象的狀態(tài)集合;d表示字符集:S表示由對象狀態(tài)可能產(chǎn)生的轉(zhuǎn)移集;So表示起始狀態(tài)。對象的一個

31、狀態(tài)是對象的數(shù)據(jù)屬性的一個確定取值范圍,相對此范圍數(shù)據(jù)成員取真或假;轉(zhuǎn)移表示狀態(tài)的改變,每一個轉(zhuǎn)移對應(yīng)對象成員函數(shù)的執(zhí)行。轉(zhuǎn)移有條件轉(zhuǎn)移、無條件轉(zhuǎn)移和交叉轉(zhuǎn)移。對象的每一個數(shù)據(jù)成員對應(yīng)一個AOSD,每個AOSD可有多個起始狀態(tài)。構(gòu)造OSD模型的方法包括以下幾個步驟。 執(zhí)行分析表中的一行就表示對象中一個成員方法的一條執(zhí)行路徑,其中包括該路徑執(zhí)行所需的條件以及執(zhí)行后的結(jié)果表達式。由于一個方法某一執(zhí)行路徑的結(jié)果表達式可能有多個,全部列出的意義不大,僅列出引起對象狀態(tài)改變的表達式。如果沒有該類表達式,則置為空。當(dāng)遇到在某一執(zhí)行條件下無任何語句執(zhí)行的情況,則分析表的結(jié)果表達式項注明“不執(zhí)行”。借助每個成

32、員方法已有的BBD模型能很容易地完成該步驟。分析得出的執(zhí)行分析表,列出狀態(tài)變量的所有可能的狀態(tài)及取值。規(guī)定Si為一個狀態(tài),它代表一個確定的取值范圍,Si(z)表示狀態(tài)變量z在此取值范圍內(nèi),PC表示一條路徑執(zhí)行的條件。通過下面的步驟構(gòu)造轉(zhuǎn)移。 創(chuàng)建空的可達狀態(tài)集合創(chuàng)建空的可達狀態(tài)集合RS。 把由構(gòu)造函數(shù)產(chǎn)生的狀態(tài)加入到把由構(gòu)造函數(shù)產(chǎn)生的狀態(tài)加入到RS集合中,稱之為初始狀態(tài),如沒有構(gòu)造函數(shù)集合中,稱之為初始狀態(tài),如沒有構(gòu)造函數(shù),就把所有的狀態(tài)加入到,就把所有的狀態(tài)加入到RS集合中。集合中。在在RS集合中選擇一個狀態(tài)集合中選擇一個狀態(tài)Si作為前導(dǎo)狀態(tài),如作為前導(dǎo)狀態(tài),如Si為初始態(tài),則把構(gòu)造函數(shù)加入

33、到為初始態(tài),則把構(gòu)造函數(shù)加入到狀態(tài)狀態(tài)Si的轉(zhuǎn)移集合中。的轉(zhuǎn)移集合中。 選擇一條引用狀態(tài)變量選擇一條引用狀態(tài)變量D的路徑的路徑P,PCi作為其執(zhí)行條件。如果條件作為其執(zhí)行條件。如果條件Si(D)和和Pa成立,則該路徑產(chǎn)生一次轉(zhuǎn)移,并將路徑加入到轉(zhuǎn)移集合中。如條件不成立,則放成立,則該路徑產(chǎn)生一次轉(zhuǎn)移,并將路徑加入到轉(zhuǎn)移集合中。如條件不成立,則放棄該路徑,選擇另一條。棄該路徑,選擇另一條。 檢查所有的后繼狀態(tài),把正確的后繼狀態(tài)加入到檢查所有的后繼狀態(tài),把正確的后繼狀態(tài)加入到RS集合中。集合中。 重復(fù)(重復(fù)(4)、()、(5)兩步直到選擇所有路徑。)兩步直到選擇所有路徑。 從從RS集合中去掉狀態(tài)集

34、合中去掉狀態(tài)Si,再重復(fù)(,再重復(fù)(3)()(6)步直到)步直到RS集合為空。集合為空。通過對0SD模型進行遍歷,就能得到一個測試消息序列。測試消息序列中從起點到結(jié)點的每一條路徑均是一個合理的測試消息序列,選擇適當(dāng)?shù)臄?shù)據(jù)就可生成測試用例進行測試。下面用JAVA設(shè)計一個類adviceDelete,實現(xiàn)建議的刪除功能,示例源程序如下:(1)掃描源程序得出帶執(zhí)行條件的執(zhí)行分析表(見表5-1)表5-1類adviceDelete帶執(zhí)行條件的執(zhí)行分析表圖5-5所示為類adviceDelete構(gòu)造的OSD模型。圖5-5 類adviceDelete構(gòu)造的OSD模型根據(jù)每條測試消息序列,選擇相應(yīng)的數(shù)據(jù)進行測試。

35、5.2.3 測試驅(qū)動的實現(xiàn)和代碼的組織測試驅(qū)動的實現(xiàn)和代碼的組織1測試驅(qū)動的實現(xiàn)方式測試驅(qū)動的實現(xiàn)方式有了測試用例,還需要設(shè)計測試驅(qū)動程序,讓測試用例自動地執(zhí)行。測試驅(qū)動的設(shè)計本質(zhì)是通過創(chuàng)建被測類的實例和測試這些實例的行為來測試類,常見的測試驅(qū)動的設(shè)計方法有以下幾種。(1)利用main函數(shù)利用main函數(shù)方法實現(xiàn)測試驅(qū)動是一個最為簡單的方式,直接將每個測試用例寫入main函數(shù),測試結(jié)果直接輸入屏幕。以5.2.1的測試實例一為例,對類Rectangle的測試,實際就是對該類set服務(wù)的測試,測試驅(qū)動代碼如下:輸出結(jié)果如圖5-6:圖5-6 在main方法中寫入測試代碼的執(zhí)行結(jié)果在被測類中嵌入靜態(tài)方

36、法,在靜態(tài)方法內(nèi)部實現(xiàn)測試用例的執(zhí)行,然后調(diào)用該靜態(tài)方法,將測試結(jié)果輸出到屏幕,仍以5.2.1的測試實例一為例,加入靜態(tài)方法后的代碼如下:輸出結(jié)果如圖5-7:圖5-7 加入靜態(tài)方法測試代碼的執(zhí)行結(jié)果圖5-8 設(shè)計獨立類測試代碼的執(zhí)行結(jié)果隨著被測代碼的增加,測試代碼也會越來越龐大,如何管理好測試代碼,測試代碼的組織就顯得至關(guān)重要了,其常用的組織方式包括以下幾種。(1)與開發(fā)源代碼放在一起)與開發(fā)源代碼放在一起測試代碼作為單獨的方法或類與開發(fā)源代碼放同一文件上,例如,被測類Rectangle代碼放在D:WorkspacekingsrcRectangle.java中,則測試類RectangleTes

37、tCase代碼也放在D:Workspace kingsrcRectangle.java中。這樣放的好處是,測試類能夠訪問被測類中所有的屬性和方法,然而不可避免地會造成測試代碼和被測代碼的混淆,在提交產(chǎn)品需要分離測試代碼時,其工作量會非常巨大。(2)與開發(fā)源代碼放在同一目錄下)與開發(fā)源代碼放在同一目錄下例如,被測類Rectangle代碼放在D:WorkspacekingsrcRectangle.java中,則測試類RectangleTestCase代碼也放在D:WorkspacekingsrcRectangleTestCase.java中。同在src目錄下,但不在同一文件上。這樣放測試代碼會無法訪問被測類保護屬性和保護方法。解決方法:通過嵌入靜態(tài)方法調(diào)用;設(shè)計接口,通過接口調(diào)用。(3)與開發(fā)源代碼并行)與開發(fā)源代碼并行將測試代碼和開發(fā)源代碼放在同一包中,但不在同一目錄下,例如,被測類Rectangle代碼放在D:WorkspacekingperimetersrcRectangle.java中,則測試類RectangleTestCase代碼放在D:WorkspacekingperimetertestRectangle.java中。Perimeter為包名,test和src為類名。(4)與產(chǎn)品副本放在一起)與產(chǎn)品副本放在一起測試代碼和開發(fā)源代碼仍然放在同一目錄下,只是此時的開

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論