《軟件工程》12-面向?qū)ο髮?shí)現(xiàn)_第1頁
《軟件工程》12-面向?qū)ο髮?shí)現(xiàn)_第2頁
《軟件工程》12-面向?qū)ο髮?shí)現(xiàn)_第3頁
《軟件工程》12-面向?qū)ο髮?shí)現(xiàn)_第4頁
《軟件工程》12-面向?qū)ο髮?shí)現(xiàn)_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

軟件工程2022/12/102第12章面向?qū)ο髮?shí)現(xiàn)把面向?qū)ο笤O(shè)計(jì)結(jié)果,翻譯成用某種程序設(shè)計(jì)語言書寫的面向?qū)ο蟪绦?;測試并調(diào)試面向?qū)ο蟮某绦?。面向?qū)ο蟪绦虻馁|(zhì)量基本上由面向?qū)ο笤O(shè)計(jì)的質(zhì)量決定,但是,所采用的程序設(shè)計(jì)語言的特點(diǎn)和程序設(shè)計(jì)風(fēng)格也將對(duì)程序的可靠性、可重用性和可維護(hù)性產(chǎn)生影響。2022/12/103面向?qū)ο鬁y試的目標(biāo),是用盡可能低的測試成本和盡可能少的測試方案,發(fā)現(xiàn)盡可能多的錯(cuò)誤。面向?qū)ο蟪绦蛑刑赜械姆庋b、繼承和多態(tài)等機(jī)制,也給面向?qū)ο鬁y試帶來一些新特點(diǎn),增加了測試和調(diào)試的難度。必須通過實(shí)踐,努力探索適合于面向?qū)ο筌浖母玫臏y試方法。2022/12/10412.1程序設(shè)計(jì)語言12.2程序設(shè)計(jì)風(fēng)格12.3測試策略12.4設(shè)計(jì)測試用例12.5小結(jié)2022/12/10512.1程序設(shè)計(jì)語言面向?qū)ο笳Z言的優(yōu)點(diǎn)選擇編程語言的關(guān)鍵因素,是語言的一致的表達(dá)能力、可重用性及可維護(hù)性。2022/12/106面向?qū)ο笳Z言的技術(shù)特點(diǎn)純面向?qū)ο笳Z言著重支持面向?qū)ο蠓椒ㄑ芯亢涂焖僭偷膶?shí)現(xiàn)smalltalk,java混合型面向?qū)ο笳Z言的目標(biāo)則是提高運(yùn)行速度和使傳統(tǒng)程序員容易接受面向?qū)ο笏枷搿++成熟的面向?qū)ο笳Z言通常都提供豐富的類庫和強(qiáng)有力的開發(fā)環(huán)境。2022/12/107支持類與對(duì)象概念的機(jī)制(內(nèi)存回收)實(shí)現(xiàn)整體—部分結(jié)構(gòu)的機(jī)制(內(nèi)部指針)實(shí)現(xiàn)一般—特殊結(jié)構(gòu)的機(jī)制(多繼承)實(shí)現(xiàn)屬性和服務(wù)的機(jī)制(多態(tài))類型檢查(編譯時(shí)強(qiáng)弱類型檢查)類庫效率持久保存對(duì)象參數(shù)化類開發(fā)環(huán)境2022/12/10812.2程序設(shè)計(jì)風(fēng)格良好的程序設(shè)計(jì)風(fēng)格對(duì)面向?qū)ο髮?shí)現(xiàn)來說尤其重要,不僅能明顯減少維護(hù)或擴(kuò)充的開銷,而且有助于在新項(xiàng)目中重用已有的程序代碼。良好的面向?qū)ο蟪绦蛟O(shè)計(jì)風(fēng)格,既包括傳統(tǒng)的程序設(shè)計(jì)風(fēng)格準(zhǔn)則,也包括為適應(yīng)面向?qū)ο蠓椒ㄋ赜械母拍?例如,繼承性)而必須遵循的一些新準(zhǔn)則。2022/12/109提高可重用性面向?qū)ο蠓椒ㄒ粋€(gè)主要目標(biāo),是提高軟件的可重用性。軟件重用有多個(gè)層次,在編碼階段主要考慮代碼重用的問題。一般說來,代碼重用有兩種:一種是本項(xiàng)目內(nèi)的代碼重用,另一種是新項(xiàng)目重用舊項(xiàng)目的代碼。設(shè)計(jì)重用內(nèi)部重用主要是找出設(shè)計(jì)中相同或相似的部分,然后利用繼承機(jī)制共享它們。為做到外部重用(即一個(gè)項(xiàng)目重用另一項(xiàng)目的代碼),必須有長遠(yuǎn)眼光,需要反復(fù)考慮精心設(shè)計(jì)。2022/12/1010提高方法的內(nèi)聚(功能單一)減小方法的規(guī)模(提高內(nèi)聚)保持方法的一致性(能夠被子類替換)把策略與實(shí)現(xiàn)分開(抽象與實(shí)現(xiàn))為提高可重用性,在編程時(shí)不要把策略和實(shí)現(xiàn)放在同一個(gè)方法中,應(yīng)該把算法的核心部分放在一個(gè)單獨(dú)的具體實(shí)現(xiàn)方法中。為此需要從策略方法中提取出具體參數(shù),作為調(diào)用實(shí)現(xiàn)方法的變?cè)?022/12/1011全面覆蓋(考慮周全)盡量不使用全局信息(降低耦合)利用繼承機(jī)制在面向?qū)ο蟪绦蛑?,使用繼承機(jī)制是實(shí)現(xiàn)共享和提高重用程度的主要途徑。調(diào)用子過程分解因子(方法中的switch語句,多態(tài)!?。。┦褂梦邪汛a封裝在類中(走向繼承)2022/12/1012通過調(diào)用公用方法實(shí)現(xiàn)代碼重用2022/12/1013通過因子分解實(shí)現(xiàn)代碼重用2022/12/1014提高可擴(kuò)充性上一小節(jié)所述的提高可重用性的準(zhǔn)則,也能提高程序的可擴(kuò)充性。此外,下列的面向?qū)ο蟪绦蛟O(shè)計(jì)準(zhǔn)則也有助于提高可擴(kuò)充性。封裝實(shí)現(xiàn)策略不要用一個(gè)方法遍歷多條關(guān)聯(lián)鏈(功能不單一)避免使用多分支語句精心確定公有方法(對(duì)外接口)2022/12/1015提高健壯性程序員在編寫實(shí)現(xiàn)方法的代碼時(shí),既應(yīng)該考慮效率,也應(yīng)該考慮健壯性。通常需要在健壯性與效率之間做出適當(dāng)?shù)恼壑?。必須認(rèn)識(shí)到,對(duì)于任何一個(gè)實(shí)用軟件來說,健壯性都是不可忽略的質(zhì)量指標(biāo)。為提高健壯性應(yīng)該遵守以下幾條準(zhǔn)則。預(yù)防用戶的操作錯(cuò)誤檢查參數(shù)的合法性不要預(yù)先確定限制條件先測試后優(yōu)化2022/12/101612.3測試策略經(jīng)典策略是,從“小型測試”開始,逐步過渡到“大型測試”,用軟件測試專業(yè)術(shù)語來說,就是從單元測試開始,逐步進(jìn)入集成測試,最后進(jìn)行確認(rèn)測試和系統(tǒng)測試。對(duì)于傳統(tǒng)軟件系統(tǒng),單元測試集中測試可編譯的程序單元(過程模塊),然后集成到程序結(jié)構(gòu)中,同時(shí)進(jìn)行回歸測試,以發(fā)現(xiàn)模塊接口和新單元加入帶來的錯(cuò)誤。再把系統(tǒng)作為一個(gè)整體來測試,發(fā)現(xiàn)軟件需求中的錯(cuò)誤。測試面向?qū)ο筌浖牟呗耘c上述基本相同,但有新特點(diǎn)。2022/12/1017面向?qū)ο蟮膯卧獪y試最小的可測試單元是封裝起來的類和對(duì)象。一個(gè)類可以包含一組不同的操作,而一個(gè)特定的操作也可能存在于一組不同的類中。因此,對(duì)于面向?qū)ο蟮能浖碚f,單元測試的含義發(fā)生了很大變化。不能再孤立地測試單個(gè)操作,而應(yīng)該把操作作為類的一部分來測試。2022/12/1018面向?qū)ο蟮募蓽y試面向?qū)ο筌浖募蓽y試有兩種不同的策略?;诰€程的測試(thread-basedtesting):把響應(yīng)系統(tǒng)的一個(gè)輸入或一個(gè)事件所需要的一組類集成起來。分別集成并測試每個(gè)線程,同時(shí)應(yīng)用回歸測試以保證沒有產(chǎn)生副作用?;谑褂玫臏y試(use-basedtesting):首先測試幾乎不使用服務(wù)類的那些類(稱為獨(dú)立類),接下來測試使用獨(dú)立類的下一個(gè)層次的類(稱為依賴類)。對(duì)依賴類的測試一個(gè)層次一個(gè)層次地持續(xù)進(jìn)行下去,直至把整個(gè)軟件系統(tǒng)構(gòu)造完為止。2022/12/1019集群測試(clustertesting)是面向?qū)ο筌浖蓽y試的一個(gè)步驟:用精心設(shè)計(jì)的測試用例檢查一群相互協(xié)作的類(通過研究對(duì)象模型可以確定協(xié)作類),這些測試用例力圖發(fā)現(xiàn)協(xié)作錯(cuò)誤。2022/12/1020面向?qū)ο蟮拇_認(rèn)測試在確認(rèn)測試或系統(tǒng)測試層次,不再考慮類之間相互連接的細(xì)節(jié)。和傳統(tǒng)的確認(rèn)測試一樣,面向?qū)ο筌浖拇_認(rèn)測試也集中檢查用戶可見的動(dòng)作和用戶可識(shí)別的輸出。為了導(dǎo)出確認(rèn)測試用例,測試人員應(yīng)該認(rèn)真研究動(dòng)態(tài)模型和描述系統(tǒng)行為的腳本,以確定最可能發(fā)現(xiàn)用戶交互需求錯(cuò)誤的情景。2022/12/1021傳統(tǒng)的黑盒測試方法也可用于設(shè)計(jì)確認(rèn)測試用例但對(duì)于面向?qū)ο蟮能浖碚f,主要還是根據(jù)動(dòng)態(tài)模型和描述系統(tǒng)行為的腳本來設(shè)計(jì)確認(rèn)測試用例2022/12/102212.4設(shè)計(jì)測試用例測試類的方法軟件測試從“小型”測試開始,逐步過渡到“大型”測試。對(duì)面向?qū)ο蟮能浖碚f,小型測試著重測試單個(gè)類和類中封裝的方法。測試單個(gè)類的方法主要有,隨機(jī)測試、劃分測試和基于故障的測試等三種。2022/12/1023隨機(jī)測試銀行系統(tǒng)的account(賬戶)類有下列操作:open(打開),setup(建立),deposit(存款),withdraw(取款),balance(余額),summarize(清單),creditLimit(透支限額)和close(關(guān)閉)。每個(gè)操作都可以應(yīng)用于account類的實(shí)例,但該系統(tǒng)的性質(zhì)對(duì)操作的應(yīng)用施加了一些限制,如必須在其他操作之前先打開賬戶,完成全部操作之后才關(guān)閉賬戶。即使有這些限制,可做的操作也有許多種排列方法。一個(gè)account類實(shí)例的最小行為歷史包括下列操作:2022/12/1024open·setup·deposit·withdraw·close這是對(duì)account類的最小測試序列。但在下面的序列中可能發(fā)生許多其他行為:Open·setup·deposit·[deposit|withdraw|balance|summarize|c(diǎn)reditLimit]n

·withdraw·close上列序列可以隨機(jī)產(chǎn)生一系列不同的操作序列,如:#r1:open·setup·deposit·deposit·balance·summarize·withdraw·close#r2:open·setup·deposit·withdraw·deposit·balance·creditLimit·withdraw·close執(zhí)行上述這些及另外一些隨機(jī)產(chǎn)生的測試用例,可以測試類實(shí)例的不同生存歷史。2022/12/1025劃分測試與測試傳統(tǒng)軟件時(shí)采用等價(jià)劃分方法類似,采用劃分測試(partitiontesting)方法可以減少測試類時(shí)所需要的測試用例的數(shù)量。首先,把輸入和輸出分類,然后設(shè)計(jì)測試用例以測試劃分出的每個(gè)類別。2022/12/1026基于狀態(tài)的劃分根據(jù)類操作改變類狀態(tài)的能力來劃分類操作。account類的狀態(tài)操作包括deposit和withdraw,而非狀態(tài)操作有balance,summarize和creditLimit。設(shè)計(jì)測試用例,分別測試改變狀態(tài)的操作和不改變狀態(tài)的操作。如:測試用例#p1:open·setup·deposit·deposit·withdraw·withdraw·close#p2:open·setup·deposit·summarize·creditLimit·withdraw·close測試用例#P1改變狀態(tài),而測試用例#P2測試不改變狀態(tài)的操作(在最小測試序列中的操作除外)。2022/12/1027基于屬性的劃分根據(jù)類操作使用的屬性來劃分類操作。對(duì)于account類來說,可使用屬性balance來定義劃分,從而把操作劃分成三個(gè)類別:使用balance的操作;修改balance的操作;不使用也不修改balance的操作。然后,為每個(gè)類別設(shè)計(jì)測試序列。2022/12/1028基于故障的測試基于故障的測試(fault_basedtesting)與傳統(tǒng)的錯(cuò)誤推測法類似,是首先推測軟件中可能有的錯(cuò)誤,然后設(shè)計(jì)出最可能發(fā)現(xiàn)這些錯(cuò)誤的測試用例。例如,軟件工程師經(jīng)常在問題的邊界處犯錯(cuò)誤,因此,在測試SQRT(計(jì)算平方根)操作(該操作在輸入為負(fù)數(shù)時(shí)返回出錯(cuò)信息)時(shí),應(yīng)該著重檢查邊界情況:一個(gè)接近零的負(fù)數(shù)和零本身。其中“零本身”用于檢查程序員是否犯了如下錯(cuò)誤:2022/12/1029把語句if(x>=0)calculate-square-root();誤寫成if(x>0)calculate-square-root();為了推測出軟件中可能有的錯(cuò)誤,應(yīng)該仔細(xì)研究分析模型和設(shè)計(jì)模型,而且在很大程度上要依靠測試人員的經(jīng)驗(yàn)和直覺。如果推測得比較準(zhǔn)確,則使用基于故障的測試方法能夠用相當(dāng)?shù)偷墓ぷ髁堪l(fā)現(xiàn)大量錯(cuò)誤;反之,如果推測不準(zhǔn),則這種方法的效果并不比隨機(jī)測試技術(shù)的效果好。2022/12/1030集成測試方法開始集成面向?qū)ο笙到y(tǒng)以后,測試用例的設(shè)計(jì)變得更加復(fù)雜。必須對(duì)類間協(xié)作進(jìn)行測試。為說明設(shè)計(jì)類間測試用例的方法,擴(kuò)充銀行系統(tǒng)的例子,使它包含圖所示的類和協(xié)作。箭頭方向代表消息的傳遞方向,箭頭線上的標(biāo)注給出了作為由消息所蘊(yùn)含的協(xié)作的結(jié)果而調(diào)用的操作。2022/12/1031銀行系統(tǒng)的類—協(xié)作圖2022/12/1032和測試單個(gè)類相似,測試類協(xié)作可以使用隨機(jī)測試方法和劃分測試方法,以及基于情景的測試和行為測試完成。多類測試生成多個(gè)類的隨機(jī)測試用例:對(duì)每個(gè)客戶類,使用類操作符列表來生成一系列隨機(jī)測試序列。這些操作符向服務(wù)類實(shí)例發(fā)送消息。對(duì)所生成的每個(gè)消息,確定協(xié)作類和在服務(wù)對(duì)象中對(duì)應(yīng)操作符。對(duì)服務(wù)對(duì)象中的每個(gè)操作符(已經(jīng)被來自客戶對(duì)象的消息調(diào)用),確定傳遞的消息。對(duì)每個(gè)消息,確定下一層被調(diào)用的操作符,并把這些操作符結(jié)合進(jìn)測試序列中。2022/12/1033用上述步驟生成多個(gè)類的隨機(jī)測試用例,考慮Bank類相對(duì)于ATM類的操作序列:verifyAcct

·

verifyPIN

·[[verifyPolicy·withdrawReq]|depositReq|acctInfo]n對(duì)Bank類的隨機(jī)測試用例可能是:#r3:verifyAcct

·

verifyPIN

·

depositReq上述測試涉及的協(xié)作者,考慮與測試用例#r3中的每個(gè)操作相關(guān)聯(lián)的消息。Bank必須和ValidationInfo協(xié)作以執(zhí)行verifyAcct和verifyPIN,Bank還必須和Account協(xié)作以執(zhí)行depositReq。因此,測試上面的協(xié)作的新測試用例是:2022/12/1034#r4:verifyAcctBank

·[validAcctValidationInfo]·

verifyPINBank·[validPINvalidationInfo

]·

depositReq

·

[depositaccount]多個(gè)類的劃分測試方法類似于單個(gè)類的劃分測試方法。但對(duì)于多類測試,應(yīng)擴(kuò)充測試序列以包括那些通過發(fā)送給協(xié)作類的消息而被調(diào)用的操作。另一種劃分測試方法,根據(jù)與特定類的接口來劃分類操作。Bank類接收來自ATM類和Cashier類的消息,因此,可以通過把Bank類中的方法劃分成服務(wù)于ATM的和服務(wù)于Cashier的兩類來測試它們。還可以用基于狀態(tài)的劃分,進(jìn)一步精化劃分。2022/12/1035從動(dòng)態(tài)模型導(dǎo)出測試用例類的狀態(tài)圖可以幫助導(dǎo)出測試該類(及與其協(xié)作的那些類)的動(dòng)態(tài)行為的測試用例。圖9.4是account類的狀態(tài)圖,初始轉(zhuǎn)換經(jīng)過了emptyacct和setupacct這兩個(gè)狀態(tài),而類實(shí)例的大多數(shù)行為發(fā)生在workingacct狀態(tài)中,最終的withdraw和close使得account類分別向nonworkingacct狀態(tài)和deadacct狀態(tài)轉(zhuǎn)換。2022/12/1036account類的狀態(tài)轉(zhuǎn)換圖2022/12/1037設(shè)計(jì)出的測試用例應(yīng)該覆蓋所有狀態(tài),操作序列應(yīng)使account類實(shí)例遍歷所有允許的狀態(tài)轉(zhuǎn)換:測試用例#s1:open·setupAccnt·deposit(initial)·withdraw(final)·close上面列出的序列與前面討論的最小測試序列相同。向最小序列中加入附加的測試序列,可以得出其他測試用例:2022/12/1038測試用例#s2:open·setupAccnt·deposit(initial)·deposit·balance·credit·withdraw(final)·close#s3:open·setupAccnt·deposit(initial)·deposit·withdraw·accntInfo·withdraw(final)·close還可導(dǎo)出更多測試用例,以保證該類的所有行為都被適當(dāng)?shù)販y試了。在類的行為導(dǎo)致與一個(gè)或多個(gè)類協(xié)作的情況下,使用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論