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

下載本文檔

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

文檔簡介

1、第六章 面向?qū)ο筌浖臏y試,[本章要點] 面向?qū)ο筌浖臏y試與傳統(tǒng)軟件的區(qū)別;類測試價值的評估方法;類測試用例設(shè)計方法;特殊類的測試方法;劃分面向?qū)ο筌浖y試的方法;開源工具Junit的使用方法。,[本章目標] 了解面向?qū)ο蟮臏y試與傳統(tǒng)軟件測試的異同;掌握類測試的基礎(chǔ)知識;重點理解針對抽象類以及接口類等特殊類的測試技巧,設(shè)計類測試用例和測試驅(qū)動程序的幾種方法;初步了解Junit。,6.1面向?qū)ο蟮臏y試與傳統(tǒng)測試的比

2、較 傳統(tǒng)的測試計算機軟件的策略是從“小型測試”開始,逐步走向“大型測試”,且單元測試集中在最小的可編譯程序單位——子程序。 面向?qū)ο蟪绦虻慕Y(jié)構(gòu)不再是傳統(tǒng)的功能模塊結(jié)構(gòu),而是作為一個整體,并且對每個開發(fā)階段都有不同以往的要求和結(jié)果,已經(jīng)不可能用功能細化的觀點來檢測面向?qū)ο蠓治龊驮O(shè)計的結(jié)果。 面向?qū)ο蟮能浖y試分為:面向?qū)ο蠓治龅臏y試,面向?qū)ο笤O(shè)計的測試,面向?qū)ο缶幊痰臏y試,,面向?qū)ο髥卧獪y

3、試,面向?qū)ο蠹蓽y試,面向?qū)ο笙到y(tǒng)測試。 1、傳統(tǒng)的面向過程分析與面向?qū)ο蠓治觯∣OA) 2、結(jié)構(gòu)化的設(shè)計方法與面向?qū)ο笤O(shè)計(OOD) 3、典型的面向?qū)ο蟪绦蚓哂欣^承、封裝和多態(tài)的新特性。 4、傳統(tǒng)的單元測試的對象是軟件設(shè)計的最小單位——模塊。 5、傳統(tǒng)的集成測試,主要有兩種功能模塊測試的方式:①自頂向下集成 ②自底向上集成。面向?qū)ο蠹蓽y試采用基于路徑的集成策略(MM-路徑)。,6、為了保證軟件的功能完整性,除

4、了單元測試和集成測試,還必須經(jīng)過規(guī)范的系統(tǒng)測試。 6.1.1信息隱蔽對測試的影響 類的重要作用之一是信息隱蔽。它對類中所封裝的信息的存取進行控制,從而避免類中有關(guān)實現(xiàn)細節(jié)的信息被錯誤地使用。該隱蔽機制給測試帶來了困難。 6.1.2封裝和繼承對測試的影響 若一個類得到了充分的測試,當其被子類繼承后,繼承的方法在子類的環(huán)境中的行為特征需要重新測試。,6.1.3多態(tài)性對測試的影響 傳統(tǒng)軟件

5、測試中經(jīng)常使用靜態(tài)分析技術(shù)對代碼進行分析;面向?qū)ο筌浖?,由于動態(tài)綁定和多態(tài)性的存在所帶來的不確定性,給測試覆蓋率的滿足增大了難度。 6.2 類測試基礎(chǔ) 1、類測試概念:驗證類的實現(xiàn)是否和該類的說明完全一致。 2、類測試的方法:通過代碼檢查或執(zhí)行測試用例的方法來有效地進行類測試。(后者優(yōu)于前者)。,3、類測試人員 類測試通常由開發(fā)人員來進行;(會帶來好處和不足之處)。4、類測試時間 類的測試

6、伴隨著開發(fā)過程中的各個階段,當類的說明或?qū)崿F(xiàn)發(fā)生變化時應(yīng)該執(zhí)行回歸測試。5、類測試過程 為類創(chuàng)建實例-->創(chuàng)造適當?shù)沫h(huán)境-->運行測試用例(向一個實例發(fā)送一個或多個消息)-->通過參數(shù)來檢查測試運行的結(jié)果-->清除執(zhí)行測試用例所需的測試環(huán)境。,6.2.1類在UML中的描述 UML(Unified Modeling Language)語言是一種支持對象技術(shù)的建模語言,是在計算機

7、系統(tǒng)中表示真實世界的語言,描述真實世界中的對象和它們之間的關(guān)系,支持應(yīng)用的開發(fā)。 在UML中,用來表示類的符號是矩形,并劃分為三個區(qū)域,分別是: ⑴名稱區(qū)域:顯示類的名稱 ⑵屬性區(qū)域:顯示在類中定義的變量。 ⑶操作區(qū)域:顯示在類中定義的方法。 如圖6-1所示:,,圖6-1 類的UML表示法,類之間的關(guān)系分為六類,分別是關(guān)聯(lián)、泛化、實現(xiàn)、依賴、聚合和組合。每種關(guān)系分別使用不

8、同的符號來表示(如:表6-1所示),并分別用私有的、保護的和公有的三個關(guān)鍵字來修飾類(如:表6-2所示)。,表6-1 UML類圖符號描述,,表6-2 UML類圖作用域描述,,6.2.2類測試的價值 選擇將每個類作為一個單元進行單獨的測試,還是將其同其他類綁定進行集成測試,需要使用如下4個要素來進行測試價值的評估:,,1、類本身的復雜程度 2、類在整個系統(tǒng)中的層次 3、開發(fā)該類測試驅(qū)動程序需要投入的成本

9、 4、類本身的風險程度6.2.3類測試用例設(shè)計 一般基于如下3個標準設(shè)計測試系列,即基于狀態(tài)的覆蓋率、基于限制的覆蓋率和基于代碼的覆蓋率。 根據(jù)狀態(tài)轉(zhuǎn)換確定測試用例,6.2.4類測試驅(qū)動程序設(shè)計 從開發(fā)的角度:測試驅(qū)動的基本思想是在設(shè)計之前先考慮好測試代碼;從測試的角度:為了執(zhí)行測試,運行測試用例,找出軟件中隱藏的BUG。 因此,測試驅(qū)動程序的構(gòu)建應(yīng)該簡單、透明、易維護,能

10、夠提供盡可能多的服務(wù),同時兼顧自增量更新,更理想的情況就是能夠復用已存在的測試驅(qū)動程序的代碼。,編寫類測試驅(qū)動程序的方法有很多種 ,以Java語言為例來說明測試驅(qū)動程序設(shè)計的結(jié)構(gòu)。 1、在main方法中寫入需要運行的測試用例,即實現(xiàn)main方法,然后編譯、執(zhí)行該類。 2、在類中實現(xiàn)一個靜態(tài)測試方法,通過調(diào)用該測試方法來收集每個測試用例的執(zhí)行結(jié)果。 3、實現(xiàn)獨立的測試類,它的職責是執(zhí)行并收集每個測試用例的結(jié)果。

11、,6.3類測試的延伸 類測試構(gòu)造思想以及如何對接口類、抽象類等進行測試的方法。 一、繼承層次結(jié)構(gòu)中類的測試 繼承是實現(xiàn)接口和代碼復用的有效機制。根據(jù)繼承機制的特點,父類中被測試用例所測試的代碼被子類繼承,只要父類代碼沒有被子類“覆蓋”,那么就不用重新創(chuàng)建這些測試用例。 圖6-6顯示了各類之間的繼承關(guān)系:,,圖6-6 類之間的繼承關(guān)系,Class_A類有兩個實例方法operation

12、1()和operation2(),Class_B類繼承了Class_A類并且實現(xiàn)了新的實例方法operation3(),Class_C類繼承了Class_B類,覆蓋了Class_B類的實例方法operation3()和實例方法operation2().,根據(jù)圖6-6中這三個類之間的區(qū)別,可以確定繼承的測試用例中是否需要產(chǎn)生新的子類測試用例,哪些測試用例適用于測試子類,哪些測試用例在測試子類中不必執(zhí)行,如下表6-7所示:,,由此,可以得出

13、繼承層次結(jié)構(gòu)中類測試的測試用例可以采用如下增補原則: 1)如果子類新增了一個或者多個新的操作,就需要增加相應(yīng)的測試用例。 2)如果子類定義的同名方法覆蓋了父類的方法,就需要增加相應(yīng)的測試用例。 那么,在具體構(gòu)建類測試用例時可以采用如圖6-7所示的結(jié)構(gòu)。對于基類我們要全部測試,底層的測試類可以對其父類的測試方法回歸。,,圖6-7 類測試用例的構(gòu)建,二、接口類測試 對類進行測試時需要構(gòu)建可執(zhí)

14、行的類實例,而接口不存在任何構(gòu)造方法無法被實現(xiàn)。 由于接口一定會在某個類中實現(xiàn),因此就使用一個實現(xiàn)接口的類來做測試。遵循以下原則:如果接口沒有被任何類實現(xiàn)就無需進行測試。如果已被別的類實現(xiàn),那么就針對實現(xiàn)該接口的類進行測試。(如下圖6-8),,圖6-8 InterFace接口測試類圖,6.4面向?qū)ο鬁y試的層次 在傳統(tǒng)軟件中,確定單元的指導方針是: 1、能夠自身編譯的最小程序塊; 2、

15、單一過程/函數(shù)(獨立); 3、由一個人完成的小規(guī)模工作。 面向?qū)ο筌浖y試與傳統(tǒng)方法的區(qū)別:指導方針中沒有明確說明是把類還是方法作為單元。 下面對分別以方法和類作為單元的測試進行簡單的介紹和比較。,⑴ 以方法為單元 可以將面向?qū)ο髥卧獪y試歸結(jié)為傳統(tǒng)的單元測試??梢允褂盟袀鹘y(tǒng)功能性測試和結(jié)構(gòu)性測試技術(shù)。前期工作相對容易,但后續(xù)測試工作重。⑵ 以類為單元面向?qū)ο鬁y試的層次,取決于單元的構(gòu)成,

16、一般采用三層或四層方式。如果把單個操作或方法看作單元,則有四層測試,即操作/方法、類、繼承和系統(tǒng)測試。 面向?qū)ο鬁y試的主要問題是集成測試,可以看作是第三層,即通過測試的類之間的交互測試。,6.5 Junit簡介 Junit是用于測試使用Java語言編寫的面向?qū)ο蟪绦虻膯卧墱y試工具。 (由Eric Gamma及Kent Beck編寫的,由SourceForge發(fā)行,使用許可證遵循IBM’s common

17、 Public License Version 1.0公開版權(quán)規(guī)范) *優(yōu)點* : 1、提升程序代碼的質(zhì)量的同時,Junit測試使我們能夠更快速的編寫程序。 2、Junit使用簡單 3、Junit能夠檢驗測試結(jié)果并立即提供反饋。,4、Junit測試可以組織成一個有層次的測試系列架構(gòu)。 5、使用Junit開發(fā)測試成本低。 6、Junit測試提升軟件的穩(wěn)定性。

18、 7、Junit測試是使用Java語言開發(fā)的。 8、Junit是免費的。 一、Junit的安裝和配置 (略) 二、Junit的卸載步驟 (略) 三、支持Junit的Java IDE (略) 目前主要有 Forte for Java 3.0 Enterprise Edition; JBuilder 6 Enterprise Edition; Visual A

19、ge for Java等 。,四、Junit的各種斷言 Junit提供了一些用于幫助我們確定某個被測試函數(shù)是否正常工作的輔助函數(shù),通常把這些函數(shù)稱之為斷言??梢耘袛嗄硹l件是否為真;兩數(shù)據(jù)是否相等。 下面舉出一些斷言方法: ⑴用于判斷是否相等 AssertEquals([報告出錯信息String message],期望值expected,實際產(chǎn)生的值actual) ⑵用來判斷給定

20、的對象是否為空/(是否為非空) assertNull/ assertNotNull([String message],java.lang.Object object) 如果答案為否,則會失敗,同樣message參數(shù)是可選的。,注意:當某個斷言失敗的時候,其所在的測試方法就會停止,也就是說剩余的斷言將不會執(zhí)行,此時應(yīng)該先修復這個失敗的測試再繼續(xù)進行其他測試。另外,當有的測試失敗時不能給原有代碼添加新的特性!此時,應(yīng)該盡快的

21、修復這個錯誤,直到所有的測試都順利通過。 五、Junit自動化測試框架 定義:就是可以對代碼進行單元測試的框架。,簡單的自動化測試框架應(yīng)該滿足如下幾個要求: 1、能夠以某種方式將測試用例組織成一個測試包,以便可以一次執(zhí)行所有測試用例,盡量達到讓實現(xiàn)人員或者測試人員按一個按鈕就能完成所有的測試工作,并且輸出清晰的測試結(jié)果的目的。2、支持簡單的操作,可以向測試包中添加任意多個測試用例,并且不影響測試包的正常運行。3、

22、支持測試隨意組合(一個測試包可以包含其他的測試包)。 Junit的自動化測試框架如圖6-9所示:,,圖6-9 Junit的自動化測試框架,Junit.Framework包中包含了Junit測試類所需的所有基類(Base Class),實際上這個包也是整個Junit的基礎(chǔ)框架(Base_Framework)。TestCase類是這個包的核心,測試人員可在繼承TestCase類的基礎(chǔ)上開發(fā)自己的測試驅(qū)動程序。其余的類用來支持TestCa

23、se類,其中的TestSuite用來聚合多個測試用例(TestCase);Assert類用來驗證期望值和實際值。 下面通過一段代碼對Junit框架的使用進行簡單介紹(包含了前面介紹的斷言)。,Line 1 import junit.framework.*; //導入必需的Junit類庫 2 public class TestSimple extends TestCase{

24、 //在繼承TestCase類的基礎(chǔ)上開發(fā) 3 public TestSimple(String name){ 4 super(name); 5 } 6 public void testPlus(){ 7 assertEquals(2,3-1); 8 } 9 } 一個測試類會包含一些測試方法;每個方法可以包含一

25、個或者多個斷言語句,這些功能能滿足最基本的測試要求。 但有時候希望在一個測試類中能調(diào)用其他測試類,或者測試人員可能只想運行一個測試類中的某些方法??梢酝ㄟ^創(chuàng)建Test suite來實現(xiàn)。,,例如,給出如下一個類似TestSimple的測試驅(qū)動類,二者不同之處在于增加了一個靜態(tài)的Test suite方法,通過suite()方法就可以返回任何想得到的測試集合代碼如下:Line 1 import junit.framework.*;

26、 2 public class TestSimple extends TestCase{ 3 public TestSimple(String name){ 4 super(name); 5 }6 public void testPlus(){7 assertEquals(2,3-1);8 },9

27、 public void testAdd(){10 assertEquals(4,2+2); } public void testMultiple(){ assertEquals(4,2╳2); }15 public static Test suite(){ TestSuite suite=new TestSuite(); Suite.addTest(

28、 new TestClassOne(“testPlus”)); Suite.addTest(20 new TestClassOne(“testAdd”)); return suite; } },六、環(huán)境的建立和清理 每個測試的運行是相互獨立的,每次測試都要重新設(shè)置某些測試環(huán)境;在測試完成之后釋放一些資源。 Junit中的TestCase基類就為我

29、們提供了這樣兩個方法,可以分別用于環(huán)境的建立和清理: protected void setUp(); protected void teardown();,本章小結(jié) 本章在分析面向?qū)ο蟮能浖y試與傳統(tǒng)的軟件測試的基礎(chǔ)之上,對面向?qū)ο蟮能浖y試的基本知識進行了簡單的介紹; 接下來分別從不同層面分析了面向?qū)ο蟮能浖y試技術(shù)。 并介紹了面向?qū)ο髥卧獪y試的常用工具(junit),及安裝和卸載的

溫馨提示

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

評論

0/150

提交評論