面向?qū)ο髮?shí)現(xiàn)及測(cè)試第九章課件_第1頁(yè)
面向?qū)ο髮?shí)現(xiàn)及測(cè)試第九章課件_第2頁(yè)
面向?qū)ο髮?shí)現(xiàn)及測(cè)試第九章課件_第3頁(yè)
面向?qū)ο髮?shí)現(xiàn)及測(cè)試第九章課件_第4頁(yè)
面向?qū)ο髮?shí)現(xiàn)及測(cè)試第九章課件_第5頁(yè)
已閱讀5頁(yè),還剩89頁(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)介

面向?qū)ο蟮膶?shí)現(xiàn)主要包括兩項(xiàng)工作:(1)寫面向?qū)ο蟪绦?;?)測(cè)試并調(diào)試面向?qū)ο蟪绦蛎嫦驅(qū)ο蟪绦虻馁|(zhì)量基本上由面向?qū)ο笤O(shè)計(jì)的質(zhì)量決定,但程序設(shè)計(jì)語(yǔ)言的特點(diǎn)和設(shè)計(jì)風(fēng)格也將影響程序的可靠性、可重用性和可維護(hù)性軟件測(cè)試是保證軟件可靠性的主要措施面向?qū)ο蟮膶?shí)現(xiàn)主要包括兩項(xiàng)工作:1§9.1程序設(shè)計(jì)語(yǔ)言9.1.1面向?qū)ο笳Z(yǔ)言的優(yōu)點(diǎn)(1)一致的表示方法(2)可重用性(3)可維護(hù)性§9.1程序設(shè)計(jì)語(yǔ)言9.1.1面向?qū)ο笳Z(yǔ)言的優(yōu)點(diǎn)(1)一29.1.2面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)(1)支持類與對(duì)象概念的機(jī)制(2)實(shí)現(xiàn)整體----部分結(jié)構(gòu)的機(jī)制(3)實(shí)現(xiàn)一般----特殊結(jié)構(gòu)的機(jī)制(4)實(shí)現(xiàn)屬性和服務(wù)的機(jī)制(5)類型檢查(6)類庫(kù)(7)效率(8)持久保存對(duì)象(9)參數(shù)化類(10)開發(fā)環(huán)境9.1.2面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)(1)支持類與對(duì)象概念的機(jī)39.1.3選擇面向?qū)ο笳Z(yǔ)言(1)將來(lái)是否占主導(dǎo)地位(2)可重用性(3)類庫(kù)和開發(fā)環(huán)境(4)其他因素9.1.3選擇面向?qū)ο笳Z(yǔ)言(1)將來(lái)是否占主導(dǎo)地位4§9.2程序設(shè)計(jì)風(fēng)格9.2.1提高可重用性(1)提高方法的內(nèi)聚(2)減小方法的規(guī)模(3)保持方法的一致性(4)把策略與實(shí)現(xiàn)分開(5)全面覆蓋(6)盡量不使用全局信息(7)利用繼承機(jī)制

調(diào)用子過(guò)程分解因子使用委托把代碼封裝在類中§9.2程序設(shè)計(jì)風(fēng)格9.2.1提高可重用性(1)提高方法59.2.1提高可擴(kuò)充性(1)封裝實(shí)現(xiàn)策略(2)不要用一個(gè)方法遍歷多條關(guān)聯(lián)鏈(3)避免使用多分支結(jié)構(gòu)(4)精心確定公有方法9.2.1提高可擴(kuò)充性(1)封裝實(shí)現(xiàn)策略69.2.1提高健壯性(1)預(yù)防用戶的操作錯(cuò)誤(2)檢查參數(shù)的合法性(3)不要預(yù)先確定限制條件(4)先測(cè)試后優(yōu)化9.2.1提高健壯性(1)預(yù)防用戶的操作錯(cuò)誤7組裝(Composition)組裝關(guān)系是一個(gè)實(shí)現(xiàn)級(jí)關(guān)系,它對(duì)應(yīng)于應(yīng)用級(jí)的聚合關(guān)系。它也叫做component(部件)或叫做ispartof(是…的一部分)。組裝與消息兩者都是類間的關(guān)系,在這種關(guān)系中,一個(gè)類的實(shí)例將是另一個(gè)類的實(shí)現(xiàn)的一部分??梢岳眉却骖悂?lái)生成新類組裝(Composition)組裝關(guān)系是一個(gè)實(shí)現(xiàn)級(jí)關(guān)系,它對(duì)8考慮Dictionary類的實(shí)現(xiàn)。在Dictionary中存儲(chǔ)item的一種數(shù)據(jù)表示是使用散列表(HashTable)。進(jìn)行Dictionary類的低層設(shè)計(jì)時(shí),要指明在Dictionary類和HashTable類之間的一個(gè)ispartof關(guān)系。在實(shí)現(xiàn)時(shí),應(yīng)當(dāng)在Dictionary類的定義中聲明這個(gè)HashTable的實(shí)例。考慮Dictionary類的實(shí)現(xiàn)。9繼承(Inheritance)繼承允許在既存類的基礎(chǔ)上定義新的類。一個(gè)新類B繼承了既存類A,則B包括了A定義的某些行為,以及它自定義的某些附加行為。有多少種面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,就有多少種不同的繼承實(shí)現(xiàn)方式。繼承(Inheritance)繼承允許在既存類的基礎(chǔ)上定義新10繼承圖繼承圖11①針對(duì)實(shí)現(xiàn)的繼承兩個(gè)類之間“針對(duì)實(shí)現(xiàn)”的繼承關(guān)系的建立指的是使用既存類的內(nèi)部表示來(lái)做為新類的內(nèi)部表示的一部分。我們不推薦這種繼承方式。考慮使用繼承來(lái)實(shí)現(xiàn)一個(gè)Circle類,為了定義一個(gè)圓,需要定義一個(gè)點(diǎn)和一個(gè)值,做為圓的圓心和半徑。因此,Point類可支持Circle類的一部分實(shí)現(xiàn)。把Point當(dāng)做派生類。①針對(duì)實(shí)現(xiàn)的繼承兩個(gè)類之間“針對(duì)實(shí)現(xiàn)”的繼承關(guān)系的建立指的12如果Circle類直接使用Point的數(shù)據(jù)成員x和y,將失去抽象。而且失去做為一個(gè)點(diǎn)的圓心的標(biāo)識(shí)。針對(duì)實(shí)現(xiàn)的繼承一般在原型開發(fā)中使用。如果Circle類直接使用Point的數(shù)據(jù)成員x和y,將失去13②針對(duì)特殊化的繼承這種繼承的使用適合于大多數(shù)面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言所提供的關(guān)系,是針對(duì)一般化-特殊化關(guān)系的。這種繼承使用isa關(guān)系。類B的一個(gè)實(shí)例是(isa)類A的一個(gè)實(shí)例。在使用中,繼承將使得既存類的界面成為新類的界面。這表明新類具有它的基類的所有行為。②針對(duì)特殊化的繼承這種繼承的使用適合于大多數(shù)面向?qū)ο蟪绦蛟O(shè)14為了定義Dictionary類,應(yīng)當(dāng)首先查找既存的抽象,看Dictionary類會(huì)是哪個(gè)既存抽象的特殊情況。Dictionary應(yīng)是一個(gè)有序表,但具有它自己特有的操作,如使用關(guān)鍵碼進(jìn)行搜索等。既存的OrderedList類可以提供Dictionary類的某些行為,但不是全部。還要確認(rèn),在OrderedList中是否有的行為在Dictionary中是不需要的。如果有,可能需要重新組織層次或者開發(fā)某些附加的抽象。為了定義Dictionary類,應(yīng)當(dāng)首先查找既存的抽象,看D15iskindof

(是一種…)繼承這種繼承允許有選擇地包含既存類的屬性,從而建立新的定義。一個(gè)鳥類可能有一個(gè)關(guān)于飛行的屬性。一個(gè)鴕鳥派生類在模型化時(shí)可能就不選擇這個(gè)屬性,因?yàn)轼r鳥不會(huì)飛。鴕鳥是一種(iskindof)鳥,但具有的屬性與鳥不完全相同。iskindof繼承是不嚴(yán)格繼承。iskindof(是一種…)繼承這種繼承允許有選擇地包16類的實(shí)現(xiàn)一種方案是先開發(fā)一個(gè)比較小的比較簡(jiǎn)單的類,做為開發(fā)比較大的比較復(fù)雜的類的基礎(chǔ)。即從簡(jiǎn)單到復(fù)雜的開發(fā)方案。在這種方案中,類的開發(fā)是分層的。一個(gè)類建立在一些既存的類的基礎(chǔ)上,而這些既存的類又是建立在其它既存的類的基礎(chǔ)上。通過(guò)諸如“isa”或“ispartof”之類的關(guān)系,利用既存代碼就能著手建立新的類。類的實(shí)現(xiàn)一種方案是先開發(fā)一個(gè)比較小的比較簡(jiǎn)單的類,做為開發(fā)比17§9.3面向?qū)ο蟮臏y(cè)試策略§9.3面向?qū)ο蟮臏y(cè)試策略18測(cè)試計(jì)算機(jī)軟件的經(jīng)典策略是從“小型測(cè)試”開始,逐步過(guò)渡到“大型測(cè)試”測(cè)試順序:?jiǎn)卧獪y(cè)試->集成測(cè)試->確定測(cè)試->系統(tǒng)測(cè)試測(cè)試計(jì)算機(jī)軟件的經(jīng)典策略是從“小型測(cè)試”開始,逐步過(guò)渡到19單元測(cè)試(類測(cè)試)

在面向?qū)ο蟓h(huán)境下,最小的可測(cè)試的單元是封裝了的類或?qū)ο螅皇浅绦蚰K。面向?qū)ο筌浖念悳y(cè)試等價(jià)于傳統(tǒng)軟件開發(fā)方法中的單元測(cè)試。但它是由類中封裝的操作和和類的狀態(tài)行為驅(qū)動(dòng)的。完全孤立地測(cè)試類的各個(gè)操作是不行的。單元測(cè)試(類測(cè)試)20考慮一個(gè)類的層次。在基類中我們定義了一個(gè)操作X。每一個(gè)派生類都使用操作X,它是在各個(gè)類所定義的私有屬性和操作的環(huán)境中使用的。因使用操作X的環(huán)境變化太大,所以必須在每一個(gè)派生類的環(huán)境下都測(cè)試操作X。在面向?qū)ο箝_發(fā)環(huán)境下,把操作完全孤立起來(lái)進(jìn)行測(cè)試,其收效是很小的??紤]一個(gè)類的層次。在基類中我們定義了一個(gè)操作X。21集成測(cè)試因?yàn)槊嫦驅(qū)ο筌浖]有一個(gè)層次的控制結(jié)構(gòu),所以傳統(tǒng)的自頂向下和自底向上的組裝策略意義不大。每次將一個(gè)操作組裝到類中(像傳統(tǒng)的增殖式組裝那樣)常常行不通,因?yàn)樵跇?gòu)成類的各個(gè)部件之間存在各種直接的和非直接的交互。對(duì)于面向?qū)ο笙到y(tǒng)的集成測(cè)試,存在兩種不同的測(cè)試策略。集成測(cè)試22基于線程測(cè)試(Thread-basedTest)

它把為響應(yīng)某一系統(tǒng)輸入或事件所需的一組類組裝在一起。每一條線索將分別測(cè)試和組裝?;谑褂玫臏y(cè)試(Use-basedTest)它著眼于系統(tǒng)結(jié)構(gòu),首先測(cè)試獨(dú)立類,這些類只使用很少的服務(wù)器類。再測(cè)試那些使用了獨(dú)立類的相關(guān)類。一系列測(cè)試各層相關(guān)類的活動(dòng)繼續(xù)下去,直到整個(gè)系統(tǒng)構(gòu)造完成?;诰€程測(cè)試(Thread-basedTest)23確認(rèn)測(cè)試在進(jìn)行確認(rèn)測(cè)試和系統(tǒng)測(cè)試時(shí),不關(guān)心類之間連接的細(xì)節(jié)。著眼于用戶的要求和用戶能夠認(rèn)可的系統(tǒng)輸出。為了幫助確認(rèn)測(cè)試的執(zhí)行,測(cè)試者需要回到分析模型,根據(jù)那里提供的事件序列(腳本)進(jìn)行測(cè)試??梢岳煤诤袦y(cè)試的方法來(lái)驅(qū)動(dòng)確認(rèn)測(cè)試。確認(rèn)測(cè)試24測(cè)試方法學(xué)檢測(cè)軟件中的故障并確定軟件是否執(zhí)行了預(yù)定要開發(fā)的功能。測(cè)試過(guò)程包括了一組測(cè)試用例的開發(fā),每一個(gè)測(cè)試用例要求能檢驗(yàn)應(yīng)用的一個(gè)特定的元素。還需要分析用各個(gè)測(cè)試用例執(zhí)行測(cè)試的結(jié)果來(lái)收集有關(guān)軟件的信息。測(cè)試方法學(xué)檢測(cè)軟件中的故障并確定軟件是否執(zhí)行了預(yù)定要開發(fā)的功25按不同層次進(jìn)行測(cè)試測(cè)試類中各個(gè)操作,主要測(cè)試類,這種測(cè)試是某些單元測(cè)試與組裝測(cè)試的組合假定測(cè)試一個(gè)軟件與測(cè)試一個(gè)類一樣。這個(gè)測(cè)試者常常就是一個(gè)特定類的開發(fā)者。按不同層次進(jìn)行測(cè)試測(cè)試類中各個(gè)操作,主要測(cè)試類,這種測(cè)試是某269.4.1類測(cè)試的種類隨機(jī)測(cè)試劃分測(cè)試基于故障的測(cè)試9.4設(shè)計(jì)測(cè)試用例9.4.1類測(cè)試的種類隨機(jī)測(cè)試9.4設(shè)計(jì)測(cè)試用例27隨機(jī)測(cè)試?yán)恒y行應(yīng)用系統(tǒng)中,account(帳戶)類的操作有:open,setup,deposit,withdraw,balance,summarize,creditLimit和close

限制:在所有操作中最先執(zhí)行open在所有操作中最后執(zhí)行close隨機(jī)測(cè)試?yán)?8則:一個(gè)account類的最小測(cè)試序列包括如下操作:open.setup.deposit.withdraw.close

但該序列中可能有許多其它行為:

open.setup.deposit.[deposit|withdraw|balance|summarize|creditLimit].withdraw.close從上述序列中可以隨機(jī)地產(chǎn)生一系列不同的操作序列:#r1:open.setup.deposit.deposit.balance.summarize.withdraw.close#r2:open.setup.deposit.withdraw.deposit.balance.creditLimit.withdraw.close則:29劃分測(cè)試(等價(jià)劃分)基于狀態(tài)的劃分根據(jù)類操作改變狀態(tài)的能力來(lái)劃分類操作。對(duì)account類來(lái)說(shuō),狀態(tài)操作包括deposit和withdraw,非狀態(tài)操作有balance,summarize和creditLimit#r1:open.setup.deposit.deposit.withdraw.withdraw.close#r2:open.setup.deposit.summarize.creditLimit.withdraw.close劃分測(cè)試(等價(jià)劃分)基于狀態(tài)的劃分30基于屬性的劃分根據(jù)類操作使用的屬性來(lái)劃分類操作。對(duì)account類來(lái)說(shuō),操作分成三個(gè)類別:

使用balance的操作

修改balance的操作

不使用也不修改balance的操作基于屬性的劃分31基于功能的劃分根據(jù)類操作所完成的功能來(lái)劃分類操作。對(duì)account類來(lái)說(shuō):

初始化操作(open,setup)

計(jì)算操作(deposit,withdraw)

查詢操作balance,summarize,creditLimit)

終止操作(close)基于功能的劃分32基于故障的測(cè)試與傳統(tǒng)的方法類似,也是首先推測(cè)軟件中可能錯(cuò)誤,然后設(shè)計(jì)出最可能發(fā)現(xiàn)這些錯(cuò)誤的測(cè)試用例。例:測(cè)試SQRT(計(jì)算平方根)操作把語(yǔ)句if(x>=0)calculate_square_root();誤寫成if(x>0)calculate_square_root();基于故障的測(cè)試與傳統(tǒng)的方法類似,也是首先推測(cè)軟件中可能錯(cuò)誤339.4.2集成測(cè)試

測(cè)試一個(gè)新類時(shí),需要先測(cè)試在定義中所涉及的類,再考慮這些類的組裝。關(guān)系“isa”“ispartof”和“refersto”建立了測(cè)試幾個(gè)類時(shí)的次序之間的關(guān)聯(lián)。一旦基本類測(cè)試完成,使用這些類的那些類可以接著測(cè)試,然后按層次繼續(xù)測(cè)試下去。9.4.2集成測(cè)試測(cè)試一個(gè)新類時(shí),需要先測(cè)試在定義中34多類測(cè)試--對(duì)每個(gè)客戶類,使用類操作符列表來(lái)生成一系列隨機(jī)測(cè)試序列,這些操作符向服務(wù)器類實(shí)例發(fā)送消息。--對(duì)所產(chǎn)生的每個(gè)消息,確定協(xié)作類和在服務(wù)器對(duì)象中的對(duì)應(yīng)操作符--對(duì)服務(wù)器中的每個(gè)操作符(已經(jīng)被來(lái)自客戶對(duì)象的消息調(diào)用),確定傳遞的消息--對(duì)每個(gè)消息,確定下一層被調(diào)用的操作符,并把這些操作符結(jié)合進(jìn)測(cè)試序列中多類測(cè)試--對(duì)每個(gè)客戶類,使用類操作符列表來(lái)生成一系列35例:銀行系統(tǒng)協(xié)作圖例:銀行系統(tǒng)協(xié)作圖36對(duì)于操作序列:

Bank類對(duì)ATM的操作序列:verifyAcct.verifyPIN.[[verifyPolicy.withdrawReq]|depositReq|acctInfoREQ]對(duì)Bank類的測(cè)試用例可能是:#r3verifyAcct.verifyPIN.depositReq為考慮協(xié)作者,上述序列中需要考慮與測(cè)試用例#r3中的每個(gè)操作相關(guān)的消息對(duì)于操作序列:37

Bank需與ValidationInfo協(xié)作以執(zhí)行verifyAcct和VerifyPIN,Bank還必須與Account協(xié)作以執(zhí)行depositReq,因此上述協(xié)作的新測(cè)試用例是:#r4:verifyAcctBank.[validAcctValidationInfo].verfyPINBank.[validPINvalidationInfo].depositReq.[depositaccount]Bank需與ValidationInfo協(xié)作以執(zhí)行v38從動(dòng)態(tài)模型導(dǎo)出測(cè)試用例例:從動(dòng)態(tài)模型導(dǎo)出測(cè)試用例例:39

設(shè)計(jì)出的測(cè)試用例應(yīng)該覆蓋所有狀態(tài),即操作序列應(yīng)該使得account類實(shí)例遍歷所有允許的狀態(tài)轉(zhuǎn)換:#s1:open.setupAccnt.deposit(initial).withdraw(final).close向該序列中加入附加的測(cè)試序列,可得到其他測(cè)試用例:#s2:open.setupAccnt.deposit(initial).deposit.balance.credit.withdraw(final).close#s3:open.setupAccnt.deposit(initial).deposit.withdraw.accntInfo.withdraw(final).close設(shè)計(jì)出的測(cè)試用例應(yīng)該覆蓋所有狀態(tài),即操作序列應(yīng)該使得40習(xí)題:以下觀念正確嗎?我們擁有一套講述如何開發(fā)軟件的書籍,書中充滿了標(biāo)準(zhǔn)與示例,可以幫助我們解決軟件開發(fā)中遇到的任何問題我們擁有最好的開發(fā)工具、最好的計(jì)算機(jī),一定能做出優(yōu)秀的軟件。如果我們落后于計(jì)劃,可以增加更多的程序員來(lái)解決。既然需求分析很困難,不管三七二十一先把軟件做了再說(shuō),反正軟件是靈活的,隨時(shí)可以修改。習(xí)題:以下觀念正確嗎?我們擁有一套講述如何開發(fā)軟件的書籍,書41習(xí)題:以下觀念正確嗎?如果軟件運(yùn)行較慢,是換一臺(tái)更快的計(jì)算機(jī)還是設(shè)計(jì)一種更快的算法?有最好的軟件工程方法,最好的編程語(yǔ)言嗎?編程時(shí)是否應(yīng)該多使用技巧?軟件中的錯(cuò)誤是否可以按嚴(yán)重程度分等級(jí)?習(xí)題:以下觀念正確嗎?如果軟件運(yùn)行較慢,是換一臺(tái)更快的計(jì)算機(jī)42判斷下列關(guān)于程序設(shè)計(jì)風(fēng)格和軟件測(cè)試的敘述。(1)用黑盒法測(cè)試時(shí),測(cè)試用例是根據(jù)程序內(nèi)部邏輯設(shè)計(jì)的(2)盡量用公共過(guò)程或子程序代替重復(fù)的代碼段。(3)測(cè)試是為了驗(yàn)證軟件已正確實(shí)現(xiàn)用戶的要求。(4)有n個(gè)判定語(yǔ)句的連鎖分支結(jié)構(gòu)有2n條路徑。(5)盡量采用復(fù)合的條件測(cè)試,避免嵌套的分支結(jié)構(gòu)。(6)GOTO類型的語(yǔ)句概念簡(jiǎn)單,使用方便,在某些情況下,保留GOTO類型的語(yǔ)句反能使寫出的程序更加簡(jiǎn)潔。(7)發(fā)現(xiàn)錯(cuò)誤多的程序模塊,殘留在模塊中的錯(cuò)誤越少。(8)程序效率的提高主要應(yīng)通過(guò)選擇高效的算法來(lái)實(shí)現(xiàn)。判斷下列關(guān)于程序設(shè)計(jì)風(fēng)格和軟件測(cè)試的敘述。43軟件測(cè)試的目的是(A)。為了提高測(cè)試的效率,應(yīng)該(B)。使用白盒測(cè)試方法時(shí),確定測(cè)試數(shù)據(jù)應(yīng)根據(jù)(C)和指定的覆蓋標(biāo)準(zhǔn)。與設(shè)計(jì)測(cè)試數(shù)據(jù)無(wú)關(guān)的文檔是(D)。

A.①評(píng)價(jià)軟件的質(zhì)量

②發(fā)現(xiàn)軟件的錯(cuò)誤

③找出軟件中的所有錯(cuò)誤

④證明軟件是正確的

B.①隨機(jī)地選取測(cè)試數(shù)據(jù)

②取一切可能的輸入數(shù)據(jù)作為測(cè)試數(shù)據(jù)

③在完成編碼以后制定軟件的測(cè)試計(jì)劃

④選擇發(fā)現(xiàn)錯(cuò)誤的可能性大的數(shù)據(jù)作為測(cè)試數(shù)據(jù)

C.

①程序的內(nèi)部邏輯

②程序的復(fù)雜程度

③使用說(shuō)明書

④程序的功能

D.

①該軟件的設(shè)計(jì)人員

②程序的復(fù)雜程度

③源程序

④項(xiàng)目開發(fā)計(jì)劃軟件測(cè)試的目的是(A)。為了提高測(cè)試的效率,應(yīng)該(B44判斷對(duì)錯(cuò)題1.軟件測(cè)試按照測(cè)試過(guò)程分類為黑盒、白盒測(cè)試2.在設(shè)計(jì)測(cè)試用例時(shí),應(yīng)包括合理的輸入條件和不

合理的輸入條件。

單元測(cè)試屬于動(dòng)態(tài)測(cè)試。從軟件開發(fā)者的角度出發(fā),普遍希望通過(guò)軟件測(cè)試暴露軟件中隱藏的錯(cuò)誤和缺陷,以考慮是否可接受該產(chǎn)品。軟件項(xiàng)目在進(jìn)入需求分析階段,測(cè)試人員應(yīng)該開始介入其中。軟件生存周期是從軟件開始開發(fā)到開發(fā)結(jié)束的整個(gè)時(shí)期。7.測(cè)試人員要堅(jiān)持原則,缺陷未修復(fù)完堅(jiān)決不予通過(guò)。判斷對(duì)錯(cuò)題458.詳細(xì)設(shè)計(jì)的目的是為軟件結(jié)構(gòu)圖中的每一個(gè)模塊確定使用的算法和塊內(nèi)數(shù)據(jù)結(jié)構(gòu),并用某種選定的表達(dá)工具給出清晰的描述。9.軟件是一種邏輯實(shí)體,而不是具體的物理實(shí)體,因而它具有抽象性。

10.測(cè)試程序僅僅按預(yù)期方式運(yùn)行就行了。面向?qū)ο髮?shí)現(xiàn)及測(cè)試第九章課件46作業(yè):根據(jù)食堂飯卡的使用腳本,畫出事件跟蹤圖用戶插卡讀卡機(jī)讀出剩余金額讀卡機(jī)顯示剩余金額給用戶和操作員操作員輸入扣減金額讀卡機(jī)將原金額數(shù)送給金額計(jì)算器讀卡機(jī)將扣減金額數(shù)送給金額計(jì)算器計(jì)算剩余金額將剩余金額數(shù)送給讀卡機(jī)讀卡機(jī)將剩余金額數(shù)寫入卡中顯示剩余金額讀卡機(jī)提示用戶取卡用戶取走卡讀卡機(jī)顯示等待狀態(tài)作業(yè):根據(jù)食堂飯卡的使用腳本,畫出事件跟蹤圖用戶插卡讀卡機(jī)讀47面向?qū)ο蟮膶?shí)現(xiàn)主要包括兩項(xiàng)工作:(1)寫面向?qū)ο蟪绦?;?)測(cè)試并調(diào)試面向?qū)ο蟪绦蛎嫦驅(qū)ο蟪绦虻馁|(zhì)量基本上由面向?qū)ο笤O(shè)計(jì)的質(zhì)量決定,但程序設(shè)計(jì)語(yǔ)言的特點(diǎn)和設(shè)計(jì)風(fēng)格也將影響程序的可靠性、可重用性和可維護(hù)性軟件測(cè)試是保證軟件可靠性的主要措施面向?qū)ο蟮膶?shí)現(xiàn)主要包括兩項(xiàng)工作:48§9.1程序設(shè)計(jì)語(yǔ)言9.1.1面向?qū)ο笳Z(yǔ)言的優(yōu)點(diǎn)(1)一致的表示方法(2)可重用性(3)可維護(hù)性§9.1程序設(shè)計(jì)語(yǔ)言9.1.1面向?qū)ο笳Z(yǔ)言的優(yōu)點(diǎn)(1)一499.1.2面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)(1)支持類與對(duì)象概念的機(jī)制(2)實(shí)現(xiàn)整體----部分結(jié)構(gòu)的機(jī)制(3)實(shí)現(xiàn)一般----特殊結(jié)構(gòu)的機(jī)制(4)實(shí)現(xiàn)屬性和服務(wù)的機(jī)制(5)類型檢查(6)類庫(kù)(7)效率(8)持久保存對(duì)象(9)參數(shù)化類(10)開發(fā)環(huán)境9.1.2面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)(1)支持類與對(duì)象概念的機(jī)509.1.3選擇面向?qū)ο笳Z(yǔ)言(1)將來(lái)是否占主導(dǎo)地位(2)可重用性(3)類庫(kù)和開發(fā)環(huán)境(4)其他因素9.1.3選擇面向?qū)ο笳Z(yǔ)言(1)將來(lái)是否占主導(dǎo)地位51§9.2程序設(shè)計(jì)風(fēng)格9.2.1提高可重用性(1)提高方法的內(nèi)聚(2)減小方法的規(guī)模(3)保持方法的一致性(4)把策略與實(shí)現(xiàn)分開(5)全面覆蓋(6)盡量不使用全局信息(7)利用繼承機(jī)制

調(diào)用子過(guò)程分解因子使用委托把代碼封裝在類中§9.2程序設(shè)計(jì)風(fēng)格9.2.1提高可重用性(1)提高方法529.2.1提高可擴(kuò)充性(1)封裝實(shí)現(xiàn)策略(2)不要用一個(gè)方法遍歷多條關(guān)聯(lián)鏈(3)避免使用多分支結(jié)構(gòu)(4)精心確定公有方法9.2.1提高可擴(kuò)充性(1)封裝實(shí)現(xiàn)策略539.2.1提高健壯性(1)預(yù)防用戶的操作錯(cuò)誤(2)檢查參數(shù)的合法性(3)不要預(yù)先確定限制條件(4)先測(cè)試后優(yōu)化9.2.1提高健壯性(1)預(yù)防用戶的操作錯(cuò)誤54組裝(Composition)組裝關(guān)系是一個(gè)實(shí)現(xiàn)級(jí)關(guān)系,它對(duì)應(yīng)于應(yīng)用級(jí)的聚合關(guān)系。它也叫做component(部件)或叫做ispartof(是…的一部分)。組裝與消息兩者都是類間的關(guān)系,在這種關(guān)系中,一個(gè)類的實(shí)例將是另一個(gè)類的實(shí)現(xiàn)的一部分。可以利用既存類來(lái)生成新類組裝(Composition)組裝關(guān)系是一個(gè)實(shí)現(xiàn)級(jí)關(guān)系,它對(duì)55考慮Dictionary類的實(shí)現(xiàn)。在Dictionary中存儲(chǔ)item的一種數(shù)據(jù)表示是使用散列表(HashTable)。進(jìn)行Dictionary類的低層設(shè)計(jì)時(shí),要指明在Dictionary類和HashTable類之間的一個(gè)ispartof關(guān)系。在實(shí)現(xiàn)時(shí),應(yīng)當(dāng)在Dictionary類的定義中聲明這個(gè)HashTable的實(shí)例??紤]Dictionary類的實(shí)現(xiàn)。56繼承(Inheritance)繼承允許在既存類的基礎(chǔ)上定義新的類。一個(gè)新類B繼承了既存類A,則B包括了A定義的某些行為,以及它自定義的某些附加行為。有多少種面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,就有多少種不同的繼承實(shí)現(xiàn)方式。繼承(Inheritance)繼承允許在既存類的基礎(chǔ)上定義新57繼承圖繼承圖58①針對(duì)實(shí)現(xiàn)的繼承兩個(gè)類之間“針對(duì)實(shí)現(xiàn)”的繼承關(guān)系的建立指的是使用既存類的內(nèi)部表示來(lái)做為新類的內(nèi)部表示的一部分。我們不推薦這種繼承方式??紤]使用繼承來(lái)實(shí)現(xiàn)一個(gè)Circle類,為了定義一個(gè)圓,需要定義一個(gè)點(diǎn)和一個(gè)值,做為圓的圓心和半徑。因此,Point類可支持Circle類的一部分實(shí)現(xiàn)。把Point當(dāng)做派生類。①針對(duì)實(shí)現(xiàn)的繼承兩個(gè)類之間“針對(duì)實(shí)現(xiàn)”的繼承關(guān)系的建立指的59如果Circle類直接使用Point的數(shù)據(jù)成員x和y,將失去抽象。而且失去做為一個(gè)點(diǎn)的圓心的標(biāo)識(shí)。針對(duì)實(shí)現(xiàn)的繼承一般在原型開發(fā)中使用。如果Circle類直接使用Point的數(shù)據(jù)成員x和y,將失去60②針對(duì)特殊化的繼承這種繼承的使用適合于大多數(shù)面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言所提供的關(guān)系,是針對(duì)一般化-特殊化關(guān)系的。這種繼承使用isa關(guān)系。類B的一個(gè)實(shí)例是(isa)類A的一個(gè)實(shí)例。在使用中,繼承將使得既存類的界面成為新類的界面。這表明新類具有它的基類的所有行為。②針對(duì)特殊化的繼承這種繼承的使用適合于大多數(shù)面向?qū)ο蟪绦蛟O(shè)61為了定義Dictionary類,應(yīng)當(dāng)首先查找既存的抽象,看Dictionary類會(huì)是哪個(gè)既存抽象的特殊情況。Dictionary應(yīng)是一個(gè)有序表,但具有它自己特有的操作,如使用關(guān)鍵碼進(jìn)行搜索等。既存的OrderedList類可以提供Dictionary類的某些行為,但不是全部。還要確認(rèn),在OrderedList中是否有的行為在Dictionary中是不需要的。如果有,可能需要重新組織層次或者開發(fā)某些附加的抽象。為了定義Dictionary類,應(yīng)當(dāng)首先查找既存的抽象,看D62iskindof

(是一種…)繼承這種繼承允許有選擇地包含既存類的屬性,從而建立新的定義。一個(gè)鳥類可能有一個(gè)關(guān)于飛行的屬性。一個(gè)鴕鳥派生類在模型化時(shí)可能就不選擇這個(gè)屬性,因?yàn)轼r鳥不會(huì)飛。鴕鳥是一種(iskindof)鳥,但具有的屬性與鳥不完全相同。iskindof繼承是不嚴(yán)格繼承。iskindof(是一種…)繼承這種繼承允許有選擇地包63類的實(shí)現(xiàn)一種方案是先開發(fā)一個(gè)比較小的比較簡(jiǎn)單的類,做為開發(fā)比較大的比較復(fù)雜的類的基礎(chǔ)。即從簡(jiǎn)單到復(fù)雜的開發(fā)方案。在這種方案中,類的開發(fā)是分層的。一個(gè)類建立在一些既存的類的基礎(chǔ)上,而這些既存的類又是建立在其它既存的類的基礎(chǔ)上。通過(guò)諸如“isa”或“ispartof”之類的關(guān)系,利用既存代碼就能著手建立新的類。類的實(shí)現(xiàn)一種方案是先開發(fā)一個(gè)比較小的比較簡(jiǎn)單的類,做為開發(fā)比64§9.3面向?qū)ο蟮臏y(cè)試策略§9.3面向?qū)ο蟮臏y(cè)試策略65測(cè)試計(jì)算機(jī)軟件的經(jīng)典策略是從“小型測(cè)試”開始,逐步過(guò)渡到“大型測(cè)試”測(cè)試順序:?jiǎn)卧獪y(cè)試->集成測(cè)試->確定測(cè)試->系統(tǒng)測(cè)試測(cè)試計(jì)算機(jī)軟件的經(jīng)典策略是從“小型測(cè)試”開始,逐步過(guò)渡到66單元測(cè)試(類測(cè)試)

在面向?qū)ο蟓h(huán)境下,最小的可測(cè)試的單元是封裝了的類或?qū)ο螅皇浅绦蚰K。面向?qū)ο筌浖念悳y(cè)試等價(jià)于傳統(tǒng)軟件開發(fā)方法中的單元測(cè)試。但它是由類中封裝的操作和和類的狀態(tài)行為驅(qū)動(dòng)的。完全孤立地測(cè)試類的各個(gè)操作是不行的。單元測(cè)試(類測(cè)試)67考慮一個(gè)類的層次。在基類中我們定義了一個(gè)操作X。每一個(gè)派生類都使用操作X,它是在各個(gè)類所定義的私有屬性和操作的環(huán)境中使用的。因使用操作X的環(huán)境變化太大,所以必須在每一個(gè)派生類的環(huán)境下都測(cè)試操作X。在面向?qū)ο箝_發(fā)環(huán)境下,把操作完全孤立起來(lái)進(jìn)行測(cè)試,其收效是很小的??紤]一個(gè)類的層次。在基類中我們定義了一個(gè)操作X。68集成測(cè)試因?yàn)槊嫦驅(qū)ο筌浖]有一個(gè)層次的控制結(jié)構(gòu),所以傳統(tǒng)的自頂向下和自底向上的組裝策略意義不大。每次將一個(gè)操作組裝到類中(像傳統(tǒng)的增殖式組裝那樣)常常行不通,因?yàn)樵跇?gòu)成類的各個(gè)部件之間存在各種直接的和非直接的交互。對(duì)于面向?qū)ο笙到y(tǒng)的集成測(cè)試,存在兩種不同的測(cè)試策略。集成測(cè)試69基于線程測(cè)試(Thread-basedTest)

它把為響應(yīng)某一系統(tǒng)輸入或事件所需的一組類組裝在一起。每一條線索將分別測(cè)試和組裝。基于使用的測(cè)試(Use-basedTest)它著眼于系統(tǒng)結(jié)構(gòu),首先測(cè)試獨(dú)立類,這些類只使用很少的服務(wù)器類。再測(cè)試那些使用了獨(dú)立類的相關(guān)類。一系列測(cè)試各層相關(guān)類的活動(dòng)繼續(xù)下去,直到整個(gè)系統(tǒng)構(gòu)造完成?;诰€程測(cè)試(Thread-basedTest)70確認(rèn)測(cè)試在進(jìn)行確認(rèn)測(cè)試和系統(tǒng)測(cè)試時(shí),不關(guān)心類之間連接的細(xì)節(jié)。著眼于用戶的要求和用戶能夠認(rèn)可的系統(tǒng)輸出。為了幫助確認(rèn)測(cè)試的執(zhí)行,測(cè)試者需要回到分析模型,根據(jù)那里提供的事件序列(腳本)進(jìn)行測(cè)試??梢岳煤诤袦y(cè)試的方法來(lái)驅(qū)動(dòng)確認(rèn)測(cè)試。確認(rèn)測(cè)試71測(cè)試方法學(xué)檢測(cè)軟件中的故障并確定軟件是否執(zhí)行了預(yù)定要開發(fā)的功能。測(cè)試過(guò)程包括了一組測(cè)試用例的開發(fā),每一個(gè)測(cè)試用例要求能檢驗(yàn)應(yīng)用的一個(gè)特定的元素。還需要分析用各個(gè)測(cè)試用例執(zhí)行測(cè)試的結(jié)果來(lái)收集有關(guān)軟件的信息。測(cè)試方法學(xué)檢測(cè)軟件中的故障并確定軟件是否執(zhí)行了預(yù)定要開發(fā)的功72按不同層次進(jìn)行測(cè)試測(cè)試類中各個(gè)操作,主要測(cè)試類,這種測(cè)試是某些單元測(cè)試與組裝測(cè)試的組合假定測(cè)試一個(gè)軟件與測(cè)試一個(gè)類一樣。這個(gè)測(cè)試者常常就是一個(gè)特定類的開發(fā)者。按不同層次進(jìn)行測(cè)試測(cè)試類中各個(gè)操作,主要測(cè)試類,這種測(cè)試是某739.4.1類測(cè)試的種類隨機(jī)測(cè)試劃分測(cè)試基于故障的測(cè)試9.4設(shè)計(jì)測(cè)試用例9.4.1類測(cè)試的種類隨機(jī)測(cè)試9.4設(shè)計(jì)測(cè)試用例74隨機(jī)測(cè)試?yán)恒y行應(yīng)用系統(tǒng)中,account(帳戶)類的操作有:open,setup,deposit,withdraw,balance,summarize,creditLimit和close

限制:在所有操作中最先執(zhí)行open在所有操作中最后執(zhí)行close隨機(jī)測(cè)試?yán)?5則:一個(gè)account類的最小測(cè)試序列包括如下操作:open.setup.deposit.withdraw.close

但該序列中可能有許多其它行為:

open.setup.deposit.[deposit|withdraw|balance|summarize|creditLimit].withdraw.close從上述序列中可以隨機(jī)地產(chǎn)生一系列不同的操作序列:#r1:open.setup.deposit.deposit.balance.summarize.withdraw.close#r2:open.setup.deposit.withdraw.deposit.balance.creditLimit.withdraw.close則:76劃分測(cè)試(等價(jià)劃分)基于狀態(tài)的劃分根據(jù)類操作改變狀態(tài)的能力來(lái)劃分類操作。對(duì)account類來(lái)說(shuō),狀態(tài)操作包括deposit和withdraw,非狀態(tài)操作有balance,summarize和creditLimit#r1:open.setup.deposit.deposit.withdraw.withdraw.close#r2:open.setup.deposit.summarize.creditLimit.withdraw.close劃分測(cè)試(等價(jià)劃分)基于狀態(tài)的劃分77基于屬性的劃分根據(jù)類操作使用的屬性來(lái)劃分類操作。對(duì)account類來(lái)說(shuō),操作分成三個(gè)類別:

使用balance的操作

修改balance的操作

不使用也不修改balance的操作基于屬性的劃分78基于功能的劃分根據(jù)類操作所完成的功能來(lái)劃分類操作。對(duì)account類來(lái)說(shuō):

初始化操作(open,setup)

計(jì)算操作(deposit,withdraw)

查詢操作balance,summarize,creditLimit)

終止操作(close)基于功能的劃分79基于故障的測(cè)試與傳統(tǒng)的方法類似,也是首先推測(cè)軟件中可能錯(cuò)誤,然后設(shè)計(jì)出最可能發(fā)現(xiàn)這些錯(cuò)誤的測(cè)試用例。例:測(cè)試SQRT(計(jì)算平方根)操作把語(yǔ)句if(x>=0)calculate_square_root();誤寫成if(x>0)calculate_square_root();基于故障的測(cè)試與傳統(tǒng)的方法類似,也是首先推測(cè)軟件中可能錯(cuò)誤809.4.2集成測(cè)試

測(cè)試一個(gè)新類時(shí),需要先測(cè)試在定義中所涉及的類,再考慮這些類的組裝。關(guān)系“isa”“ispartof”和“refersto”建立了測(cè)試幾個(gè)類時(shí)的次序之間的關(guān)聯(lián)。一旦基本類測(cè)試完成,使用這些類的那些類可以接著測(cè)試,然后按層次繼續(xù)測(cè)試下去。9.4.2集成測(cè)試測(cè)試一個(gè)新類時(shí),需要先測(cè)試在定義中81多類測(cè)試--對(duì)每個(gè)客戶類,使用類操作符列表來(lái)生成一系列隨機(jī)測(cè)試序列,這些操作符向服務(wù)器類實(shí)例發(fā)送消息。--對(duì)所產(chǎn)生的每個(gè)消息,確定協(xié)作類和在服務(wù)器對(duì)象中的對(duì)應(yīng)操作符--對(duì)服務(wù)器中的每個(gè)操作符(已經(jīng)被來(lái)自客戶對(duì)象的消息調(diào)用),確定傳遞的消息--對(duì)每個(gè)消息,確定下一層被調(diào)用的操作符,并把這些操作符結(jié)合進(jìn)測(cè)試序列中多類測(cè)試--對(duì)每個(gè)客戶類,使用類操作符列表來(lái)生成一系列82例:銀行系統(tǒng)協(xié)作圖例:銀行系統(tǒng)協(xié)作圖83對(duì)于操作序列:

Bank類對(duì)ATM的操作序列:verifyAcct.verifyPIN.[[verifyPolicy.withdrawReq]|depositReq|acctInfoREQ]對(duì)Bank類的測(cè)試用例可能是:#r3verifyAcct.verifyPIN.depositReq為考慮協(xié)作者,上述序列中需要考慮與測(cè)試用例#r3中的每個(gè)操作相關(guān)的消息對(duì)于操作序列:84

Bank需與ValidationInfo協(xié)作以執(zhí)行verifyAcct和VerifyPIN,Bank還必須與Account協(xié)作以執(zhí)行depositReq,因此上述協(xié)作的新測(cè)試用例是:#r4:verifyAcctBank.[validAcctValidationInfo].verfyPINBank.[validPINvalidationInfo].depositReq.[depositaccount]Bank需與ValidationInfo協(xié)作以執(zhí)行v85從動(dòng)態(tài)模型導(dǎo)出測(cè)試用例例:從動(dòng)態(tài)模型導(dǎo)出測(cè)試用例例:86

設(shè)計(jì)出的測(cè)試用例應(yīng)該覆蓋所有狀態(tài),即操作序列應(yīng)該使得account類實(shí)例遍歷所有允許的狀態(tài)轉(zhuǎn)換:#s1:open.setupAccnt.deposit(initial).withdraw(final).close向該序列中加入附加的測(cè)試序列,可得到其他測(cè)試用例:#s2:open.setupAccnt.deposit(initial).deposit.balance.credit.withdraw(final).close#s3:open.setupAccnt.deposit(initial).deposit.withdraw.accntInfo.withdraw(final).close設(shè)計(jì)出的測(cè)試用例應(yīng)該覆蓋所有狀態(tài),即操作序列應(yīng)該使得87習(xí)

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論