面向?qū)ο蟮能浖卧獪y試概述_第1頁
面向?qū)ο蟮能浖卧獪y試概述_第2頁
面向?qū)ο蟮能浖卧獪y試概述_第3頁
面向?qū)ο蟮能浖卧獪y試概述_第4頁
面向?qū)ο蟮能浖卧獪y試概述_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、技術(shù)創(chuàng)新,變革未來面向?qū)ο蟮能浖卧獪y試概述面向?qū)ο蟮幕靖拍顚?duì)象類消息接口封裝繼承多態(tài)面向?qū)ο蟮幕靖拍頟eter Coad 和 Edward Yourdon 提出下列等式認(rèn)識(shí)面向?qū)ο蠓椒ǎ?面向?qū)ο?對(duì)象(Object) 分類(Classification) 繼承(Inheritance) 通過消息的通信 (Communication with message)采用這四個(gè)概念開發(fā)的軟件系統(tǒng)是面向?qū)ο蟮?。面向?qū)ο蠹夹g(shù)面向?qū)ο蠓椒ǖ某霈F(xiàn),實(shí)際上是程序設(shè)計(jì)方法發(fā)展的-個(gè)返樸歸真過程。面向?qū)ο蟮膶?shí)質(zhì):從系統(tǒng)的組成上來進(jìn)行分解。對(duì)問題自然分割,利用類及對(duì)象作為基本構(gòu)造單元,以更接近人類思維的方式建立

2、問題域模型,從而使設(shè)計(jì)出的軟件盡可能直接地描述現(xiàn)實(shí)世界,構(gòu)造出模塊化的、可重用的、可維護(hù)性好的軟件,并能控制軟件的復(fù)雜性降低開發(fā)維護(hù)費(fèi)用。對(duì)象對(duì)象是指包含了一組屬性以及對(duì)這些屬性的操作的封裝體。對(duì)象之間存在著一定的關(guān)系,對(duì)象之間的交互與合作構(gòu)成更高級(jí)的行為。王五由他的頭、胳膊、腿和身體組成汽車是一種交通工具對(duì)象間的由分解所構(gòu)成的關(guān)系,part of層次;具有代表一種一般特性的對(duì)象之間的聚合關(guān)系,is a層次;代表更一般的對(duì)象間在物理上或概念上有關(guān)的相關(guān)關(guān)系。人乘坐或駕駛汽車對(duì)象是軟件開發(fā)期間測試的直接目標(biāo)。面向?qū)ο筌浖y試所關(guān)注的焦點(diǎn): (1)對(duì)象的行為是否符合它的規(guī)定說明; (2)該對(duì)象與和

3、它相關(guān)的對(duì)象是否協(xié)同工作。面向?qū)ο蟮膯卧獪y試面向?qū)ο鬁y試的單元定義可以編譯執(zhí)行的最小軟件組件;(和傳統(tǒng)測試一樣,但放棄了封裝的特點(diǎn))由一個(gè)設(shè)計(jì)人員開發(fā)的軟件組件;只包含單一操作或方法的類或子類。(設(shè)計(jì)用例方便,使集成測試目標(biāo)清晰)以方法為單元還是以類為單元,根據(jù)具體環(huán)境確定最適合的方法?!安僮鳌笔侵割惡瘮?shù)定義,“方法”指其實(shí)現(xiàn)。面向?qū)ο蟮膯卧獪y試-以方法為單元傳統(tǒng)的單元測試是針對(duì)程序的函數(shù)、過程或完成某一特定功能的程序塊。單獨(dú)的看待類的成員函數(shù),與面向過程程序中的函數(shù)或過程沒有本質(zhì)的區(qū)別,傳統(tǒng)的測試方法在面向?qū)ο髥卧獪y試中都可使用,如等價(jià)類劃分法、因果圖法、邊值分析法、邏輯覆蓋法、路徑分析法等

4、等。面向?qū)ο缶幊痰奶匦允沟脤?duì)成員函數(shù)的測試又不完全等同于傳統(tǒng)的函數(shù)或過程測試。不再孤立地測試單個(gè)操作,而是將操作作為類的一部分。尤其是繼承特性和多態(tài)特性,使子類繼承或重載的父類成員函數(shù)出現(xiàn)了傳統(tǒng)測試中未遇見的問題??紤]如下兩個(gè)問題:(1)繼承的成員函數(shù)是否都不需要測試?(2)對(duì)父類的測試是否能照搬到子類?面向?qū)ο蟮膯卧獪y試(續(xù))繼承的成員函數(shù)是否都不需要測試? 對(duì)父類中已經(jīng)測試過的成員函數(shù),以下兩種情況需要在子類中重新測試: a)繼承的成員函數(shù)在子類中做了改動(dòng); b)成員函數(shù)調(diào)用了改動(dòng)過的成員函數(shù)的部分。例:假設(shè)存在父類Base有Inherited()和Redefined()這兩個(gè)成員函數(shù),繼

5、承父類Base的子類Derived只對(duì)Redefined() 做了改動(dòng)。那么,Derived:Redefined()就需要重新測試;對(duì)于Derived:Inherited(),若它包含了調(diào)用Redefined()的語句 (比如:x=x/Redefined()),就需要重新測試,否則就不需要。面向?qū)ο蟮膯卧獪y試(續(xù))對(duì)父類的測試是否能照搬到子類? 引用前面的假設(shè),成員函數(shù)Base:Redefined()和Derived:Redefined()已經(jīng)是不同的。那么,按理應(yīng)該要對(duì)Derived:Redefined()重新測試分析,設(shè)計(jì)測試用例。但是由于面向?qū)ο蟮睦^承使得兩個(gè)函數(shù)相似,故只需要在對(duì)Bas

6、e:Redefined()的測試要求和測試用例上添加對(duì)Derived:Redefined()新的測試要求和增補(bǔ)相應(yīng)測試用例。例 Base:Redefined()含有如下語句: If (value0) message(“l(fā)ess”); else if (value=0) message(“equal”); else message(“more”); 面向?qū)ο蟮膯卧獪y試(續(xù))例(續(xù)) 在Derived:Redefined()中定義為: If (value0) message(“l(fā)ess”); else if (value=0) message(“It is equal”); else messag

7、e(“more”); if (value=88) message(“l(fā)uck”); 在原有對(duì)父類Base的測試上,對(duì)Derived:Redefined()的測試只需作如下改動(dòng):將value=0的測試結(jié)果期望改動(dòng);增加value=88的測試。 設(shè)計(jì)測試用例需要能夠?qū)嵗摹皹丁鳖惡推痱?qū)動(dòng)器作用的“主程序”類;方法一般比較簡單,復(fù)雜度較低;創(chuàng)建樁工作量較大;測試工作主要集中在集成測試:類內(nèi)和類間; 例:o-oCalendar的偽代碼:CalendarUnit類:兩個(gè)操作(設(shè)置取值和標(biāo)志)Testlt類(測試驅(qū)動(dòng)器)Date類(獲取日期,計(jì)算下一日期并打印日期)Day類(設(shè)置/獲取日期)Month

8、類(設(shè)置/獲取月份及天數(shù))Year類(設(shè)置/獲取年份及閏年判別)Testlt類和Date類123testIt4567Date.constructor891011121314151617181920Date.incrementDate.printDateDay類212223Day.constructorabDay.setCurrentPos232425Day.setDay2627Day.getDay282930313233Day.increment394041Month.constructorabMonth.setCurrentPos363738Month.setMonth3940Month.g

9、etMonth474849505152Month.increment414246434445Month.getMonthSizeMonth類的程序圖類:CalendarUnit class CalendarUnit abstract class currentPos As Integer CalendarUnit(pCurrnetPos) currentPos = pCurrnetPos End CalendarUnita. setCurrentPos(pCurrnetPos)b. currentPos = pCurrnetPos End setCurrentPos abstract prot

10、ected boolean increment()類:testlt class testlt main()1. Date testdate(testMonth,testDay,testYear)2. testdate.increment()3. testdate.printDate() End testlt類:Date class Date private Day d private Month m private Year y4. Date(pMonth,pDay,pYear)5. Year y(pYear)6. Month m(pMonth,y)7. Day d(pDay,m) End D

11、ate constructor19.printDate()20. Output(m.getMonth()+”/”+d.getDay()+”/”+y.getYear() End printDate8. increment()9. if (NOT(d.increment()10.Then11. if(NOT(m.increment()12. Then13. y.increment()14. m.setMonth(1,y) d.setDay(1,m)15. Else16. d.setDay(1,m)17. Endif18.Endif End increment類:Day class Day is A

12、 CalendarUnit private Month m21. Day(pDay,Month pMonth)22. setDay(pDay,pMonth) End Day constructor23. setDay(pDay, pMonth)24. setCurrentPos(pDay)25. m = pMonth End setDay26. getDay()27. return currentPos End getDay28. boolean increment()29. currentPos = currentPos+130. if(currentPos=m.getMonthSize()

13、31. Then return true32. Else return false33. Endif End increment類:Month class Month is A CalendarUnit private Year y private sizeIndex=34.Month(pcur,Year pYear)35. setMonth(pcur,Year pYear) End Month constructor36.setMonth(pcur,Year pYear)37. setCurrentPos(pcur)38. y=pYear End setMonth39.getMonth()4

14、0. return currentPos End getMonth41.getMonthSize()42. if(y.isleap()43. Then sizeIndex1=2944. Else sizeIndex1=2845. Endif46. return sizeIndexcurrentPos-1 End getMonthSize47.boolean increment()48. currentPos=currentPos+149. if(currentPos12)50. Then return fasle51. Else return true52. Endif End increme

15、nt類:Year class Year is A CalendarUnit53. Year(pYear)54. setCurrentPos(pYear) End Year constructor55. getYear()56. return currentPos End getYear57. boolean increment()58. currentPos = currentPos+159. return true End increment60. boolean isleap()61. if(currentPos MOD 4=0)AND NOT(currentPos MOD 100=0)O

16、R(currentPos MOD 400=0)62. Then return true63. Else return false64. Endif End isleapDate.increment的單元測試三個(gè)等價(jià)類:D1=日期:1=日期月的最后日期D2=日期:日期是非12月的最后日期D3=日期:日期是12月31日 可以解決類內(nèi)集成問題;主要問題是類的繼承性、抽象類等問題;靜態(tài)視圖繼承被忽略,扁平化的類可以解決;不能測試抽象類;以類為單元在沒有類的繼承性,只有內(nèi)部的復(fù)雜性時(shí)最有意義面向?qū)ο蟮膯卧獪y試-以類為單元類的功能性和結(jié)構(gòu)性測試對(duì)面向?qū)ο筌浖念悳y試相當(dāng)于傳統(tǒng)軟件中的單元測試。 類的測試用

17、例可以先根據(jù)其中的方法設(shè)計(jì),然后擴(kuò)展到方法之間的調(diào)用關(guān)系。類測試一般也采用傳統(tǒng)的兩種測試方式:功能性測試和結(jié)構(gòu)性測試,即黑盒測試和白盒測試。功能性測試以類的規(guī)格說明為基礎(chǔ),主要檢查類是否符合其規(guī)格說明的要求。功能性測試包括兩個(gè)層次:類的規(guī)格說明和方法的規(guī)格說明。結(jié)構(gòu)性測試則是從程序出發(fā),對(duì)類中方法進(jìn)行測試,需要考慮其中的代碼是否正確。測試分為兩層:第一層考慮類中各獨(dú)立方法的代碼,即方法要做單獨(dú)測試;第二層考慮方法之間的相互作用,即方法需要進(jìn)行綜合測試。例:擋風(fēng)玻璃雨刷(三個(gè)類合并為一個(gè)類)class windshieldWiper private wiperSpeed;leverPositio

18、n;dialPosition windshieldWiper(wiperSpeed,leverPosition,dialPosition) getWiperSpeed() setWiperSpeed() getLeverPosition() setLeverPosition() getDialPosition() setDialPosition() senseLeverUp() senseLeverDown() senseDialUp() senseDialDown()End class windshieldWiper斷電加電關(guān)間歇低速高速123046123060leverdownleveru

19、pleverdownleverdownleverupleverupdialDowndialDowndialUpdialUpInstate(Int)Instate(off)Instate(1)Instate(2)Instate(3)Instate(low)Instate(High)Instate(Int)Instate(low)Instate(1)Instate(2)windshieldWiper類的狀態(tài)圖senseLeverUp() Case leverPosition Of Case 1:Off leverPosition=Int Case dialPosition Of Case 1:1

20、wiperSpeed=4 Case 2:2 wiperSpeed=6 Case 3:3 wiperSpeed=12 EndCase dialPosition Case 2:Int leverPosition=Low wiperSpeed=30 Case 3:Low leverPosition=High wiperSpeed=60 Case 4:High (impossible;error condition) EndCase leverPosition windshieldWiper類的單元測試采用由下往上的測試;senseLeverUp/ senseLeverDown/DialUp/Dial

21、Down的測試測試windshieldWiper類的其他部分測試驅(qū)動(dòng)器類的偽代碼:class testSenseLeverUp wiperSpeed leverPos dialPos testResult booleanmain() windshieldWiper testCase(0,Off,1) testCase.senseLeverUp() leverPos= testCase.getLeverPosition() if leverPos=Int Then testResult=Pass Else testResult=Fail EndifEnd mainclass testWindsh

22、ieldWiper wiperSpeed leverPos dialPos testResult booleanmain() windshieldWiper testCase(0,Off,1) testCase.senseLeverUp() wiperSpeed = testCase.getWiperSpeed() if wiperSpeed=4 Then testResult=Pass Else testResult=Fail EndifEnd main基于類行為圖定義測試覆蓋指標(biāo):每個(gè)事件的覆蓋組件中每個(gè)狀態(tài)的覆蓋;組件中每個(gè)轉(zhuǎn)移的覆蓋;所有交互狀態(tài)覆蓋;客戶定義用例場景;測試用例前提wi

23、ndshieldWiper事件(方法)預(yù)期leverPos的輸出值123456windshieldWiper(0,Off,1)windshieldWiper(0,Int,1) windshieldWiper(0,Low,1)windshieldWiper(0,High,1)windshieldWiper(0,Low,1)windshieldWiper(0,Int,1)senseLeverUp()senseLeverUp()senseLeverUp()senseLeverDown()senseLeverDown()senseLeverDown()“間歇”“低速”“高速”“低速”“間歇”“關(guān)”控制

24、桿組件每個(gè)狀態(tài)/轉(zhuǎn)移覆蓋層次的測試用例:場景覆蓋準(zhǔn)則與系統(tǒng)級(jí)測試幾乎相同,場景:UC1正常用法描述前提擋風(fēng)玻璃雨刷在“關(guān)”位置,“刻度盤”在位置1;用戶將控制桿推到“間歇”,然后將刻度盤從位置2轉(zhuǎn)到位置3;然后將控制桿推到“低速”;用戶將控制桿推到“間歇”,然后推到“關(guān)”擋風(fēng)玻璃雨刷在“關(guān)”位置,“刻度盤”在位置1,雨刷速度為0事件序列用戶行動(dòng)系統(tǒng)應(yīng)答123456將控制桿推到“間歇”將刻度盤轉(zhuǎn)到2將刻度盤轉(zhuǎn)到3將控制桿推到“低速”將控制桿推到“間歇”將控制桿推到“關(guān)”雨刷速度為4雨刷速度為6雨刷速度為12雨刷速度為30雨刷速度為12雨刷速度為0測試用例:class testScenario wiperSpeed leverPos dialPos step1OK boolean step2OK boolean step3OK boolean step4OK boolean step5OK boolean

溫馨提示

  • 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)論