




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、面向對象軟件的測試面向對象軟件的測試 本章要點本章要點 面向對象軟件的測試與傳統軟件的區別; 類測試價值的評估方法; 類測試用例設計方法; 特殊類的測試方法; 劃分面向對象軟件測試的方法; 開源工具Junit的使用方法。 本章目標本章目標 了解面向對象的測試與傳統軟件測試的異同; 掌握類測試的基礎知識; 重點理解針對抽象類以及接口類等特殊類的測試技巧,設計類測試用例和測試驅動程序的幾種方法; 初步了解Junit,并掌握安裝和卸載此工具的方法,以及如何使用它進行簡單的測試。 面向對象的測試與傳統測試的比較面向對象的測試與傳統測試的比較 傳統的測試計算機軟件的策略是從“小型測試”開始,逐步走向“大
2、型測試”,且單元測試集中在最小的可編譯程序單位子程序。 面向對象程序的結構不再是傳統的功能模塊結構,而是作為一個整體,并且對每個開發階段都有不同以往的要求和結果,已經不可能用功能細化的觀點來檢測面向對象分析和設計的結果。 面向對象的軟件測試分為:面向對象分析的測試,面向對象設計的測試,面向對象編程的測試, 面向對象單元測試,面向對象集成測試,面向對象系統測試。 1、傳統的面向過程分析與面向對象分析(OOA) 2、結構化的設計方法與面向對象設計(OOD) 3、典型的面向對象程序具有繼承、封裝和多態的新特性。 4、傳統的單元測試的對象是軟件設計的最小單位模塊。 5、傳統的集成測試,主要有兩種通過集
3、成完成的功能模塊進行測試的方式:自頂向下集成 自底向上集成。 6、為了保證軟件的功能完整性,除了單元測試和集成測試,還必須經過規范的系統測試。信息隱蔽對測試的影響信息隱蔽對測試的影響 類的重要作用之一是信息隱蔽。它對類中所封裝的信息的存取進行控制,從而避免類中有關實現細節的信息被錯誤地使用。該隱蔽機制給測試帶來了困難。封裝和繼承對測試的影響封裝和繼承對測試的影響 若一個類得到了充分的測試,當其被子類繼承若一個類得到了充分的測試,當其被子類繼承后,繼承的方法在子類的環境中的行為特征需要后,繼承的方法在子類的環境中的行為特征需要重新測試。重新測試。 多態性對測試的影響多態性對測試的影響 傳統軟件測
4、試中經常使用靜態分析技術對代碼進行分析;面向對象軟件中,由于動態綁定和多態性的存在所帶來的不確定性,給測試覆蓋率的滿足增大了難度。類測試基礎類測試基礎 1 1、類測試概念、類測試概念:驗證類的實現是否和該類的說明完全一致。 2 2、類測試的方法、類測試的方法:通過代碼檢查或執行測試用例的方法來有效地進行類測試。(后者優于前者)。 3 3、類測試人員、類測試人員 類測試通常由開發人員來進行;(會帶來好處和不足之處)。4 4、類測試時間、類測試時間 類的測試伴隨著開發過程中的各個階段,當類的說明或實現發生變化時應該執行回歸測試。5 5、類測試過程、類測試過程 為類創建實例-創造適當的環境-運行測試
5、用例(向一個實例發送一個或多個消息)-通過參數來檢查測試運行的結果-清除執行測試用例所需的測試環境。 類在類在UMLUML中的描述中的描述 UML(Unified Modeling Language)語言是一種支持對象技術的建模語言,是在計算機系統中表示真實世界的語言,描述真實世界中的對象和它們之間的關系,支持應用的開發。 在UML中,用來表示類的符號是矩形,并劃分為三個區域,分別是: 名稱區域:顯示類的名稱 屬性區域:顯示在類中定義的變量。 操作區域:顯示在類中定義的方法。 如圖-1所示:ClassNameAttributesOperation()ClassNameAttributesOpe
6、ration()InterfaceOperation()具體類抽象類接口類圖-1 類的UML表示法 類之間的關系分為六類,分別是關聯、泛化、實現、依賴、聚合和組合。每種關系分別使用不同的符號來表示(如:表-1所示),并分別用私有的、保護的和公有的三個關鍵字來修飾類(如:表-2所示)。表-1 UML類圖符號描述 關鍵詞UML符號說明泛化關聯實現依賴聚合組合同一層次可見用作定義其他類的基類用作定義其他類的接口一方調用另一方的部分一方是另一方的部分一方是另一方的必要組成部分1.n1表-2 UML類圖作用域描述類測試的價值類測試的價值 選擇將每個類作為一個單元進行單獨的測試,還是將其同其他類綁定進行集
7、成測試,需要使用如下3個要素來進行測試價值的評估:關鍵詞UML符號說明私有保護公有-#+私有的,只在當前類中可見保護的,只對繼承的類中可見公共的,所有的關聯對象都是可見的 1、類本身的復雜程度 2、類在整個系統中的層次 3、開發該類測試驅動程序需要投入的成本 4、類本身的風險程度類測試用例設計類測試用例設計 一般基于如下一般基于如下3個標準設計測試系列,即基于個標準設計測試系列,即基于狀態的覆蓋率、基于限制的覆蓋率和基于代碼的狀態的覆蓋率、基于限制的覆蓋率和基于代碼的覆蓋率。覆蓋率。 設計測試用例的方法有多種: (例子詳見教材) 1、根據前置和后置條件確定測試用例 2、根據狀態轉換確定測試用例
8、 3、根據訪問控制修飾符(限定類、屬性或方法被程序里的其他部分訪問和調用的修飾符)來確定測試用例。 類測試驅動程序設計類測試驅動程序設計 從開發的角度:測試驅動的基本思想是在對設計 之前先考慮好測試代碼; 從測試的角度:為了執行測試,運行測試用例, 找出軟件中隱藏的BUG。 因此,測試驅動程序的構建應該簡單、透明、易維護,能夠提供盡可能多的服務,同時兼顧自增量更新,更理想的情況就是能夠復用已存在的測試驅動程序的代碼。 編寫類測試驅動程序的方法有很多種 ,以Java語言為例來說明測試驅動程序設計的結構。 (主要以兩票系統為例講解,詳見教材) 1、在main方法中寫入需要運行的測試用例,即實現ma
9、in方法,然后編譯、執行該類。 2、在類中實現一個靜態測試方法,通過調用該測試方法來收集每個測試用例的執行結果。 3、實現獨立的測試類,它的職責是執行并收集每個測試用例的結果。 類測試的延伸類測試的延伸 本節將簡要介紹類測試構造思想以及如何對接口類、抽象類等進行測試的方法。 一、繼承層次結構中類的測試 繼承是實現接口和代碼復用的有效機制。根據繼承機制的特點,父類中被測試用例所測試的代碼被子類繼承,只要父類代碼沒有被子類“覆蓋”,那么就不用重新創建這些測試用例。 圖-6顯示了各類之間的繼承關系: Class_A+operation1()+operation2()Class_B+operation
10、3()Class_C+operation2()+operation3()圖-6 類之間的繼承關系Class_A類有兩個實例方法operation1()和operation2(),Class_B類繼承了Class_A類并且實現了新的實例方法operation3(),Class_C類繼承了Class_B類,覆蓋了Class_B類的實例方法operation3()和實例方法operation2(). 根據圖-6中這三個類之間的區別,可以確定繼承的測試用例中是否需要產生新的子類測試用例,哪些測試用例適用于測試子類,哪些測試用例在測試子類中不必執行,如下表-7所示:類繼承類類方法是否改變是否增加測試用例
11、Class_AClass_BClass_BClass_AClass_Coperation1()operation2()operation3()operation2()operation1()operation3()operation2()operation1()FalseFalseFalseTrueTrueTrueFalseFalseTrueFalseTrueTrue 由此,可以得出繼承層次結構中類測試的測試用例可以采用如下增補原則: 1)如果子類新增了一個或者多個新的操作,就需要增加相應的測試用例。 2)如果子類定義的同名方法覆蓋了父類的方法,就需要增加相應的測試用例。 那么,在具體構建類測
12、試用例時可以采用如圖-7所示的結構。對于基類我們要全部測試,底層的測試類可以對其父類的測試方法回歸。 Class_A+operation1()+operation2()Class_B+operation3()Class_C+operation2()+operation3()Class_A_TestCase+testoperation1()+testoperation2()Class_B_TestCase+testoperation3()Class_C_TestCase+testoperation2()+testoperation3()圖-7 類測試用例的構建 二、接口類測試 對類進行測試時需要
13、構建可執行的類實例,而接口不存在任何構造方法無法被實現。 由于接口一定會在某個類中實現,因此就使用一個實現接口的類來做測試。遵循以下原則:l如果接口沒有被任何類實現就無需進行測試。l如果已被別的類實現,那么就針對實現該接口的類進行測試。(如下圖-8)Class_C+Class_C+a_Method()+b_Method()+c_Method()Class_C_TestCase+Class_C_TestCase()+a_Method()+b_Method()+c_Method()+newObject()+testA_Method()+testB_Method()+testB_Method()In
14、terface_A+a_method()+b_method()圖-8 InterFace接口測試類圖 三、抽象類測試 如果要構造抽象類的測試驅動程序首先要繼承測試驅動類,并且需要同時繼承被測試抽象類,因為該類不能被具體化。但Java采用單繼承機制,因此對該抽象類的測試驅動程序就不能同時繼承兩個抽象類,通常,采用以下兩種方法來處理抽象類的測試問題: 1、一般情況下,利用Java的內類機制,在抽象類的測試驅動程序內引入內類,讓內類實現對被測試抽象類的繼承,然后把它作為引用體,這樣對內類的測試就等價于對被測試抽象類的測試。舉例如下: /* AbstractExample.java*創建日期:*創建人
15、員:*修改日期:*修改人員:*/package applet.unedu.tlpe.test;public abstract class AbstractExample implements Examplepublic AbstractExample()/*AbstractExampleTester.java*創建日期:*創建人員:*修改日期:*修改人員:*/package applet.unedu.tlpe.test;public abstract class AbstractExampleTester extends TestCasestatic class AbstractExample
16、_Inner extends AbstractExamplepublic AbstractExample_Inner()super(argumentname);public AbstractExampleTester()super(argumentname);public Example newObject(argumentname)return new AbstractExample_Inner();public void testAbstractExample_Inner() 2、如果抽象類被具體類繼承,那么,在創建該具體類的測試驅動程序時要繼承抽象類的測試驅動程序,在以后的回歸測試中,只
17、要執行最低層的測試類,就可以對其父測試類重新執行一次測試,同時將測試結果分別返回。 四、重載和覆蓋測試 覆蓋是在子類中重新定義了從父類中繼承的同名方法;重載與覆蓋不同,不是子類對父類同名方法的重新定義,而是類對自身已有的同名方法的重新定義。 在測試過程中,可以參考如下兩個原則: 要對類實例方法的所有重載形式分別進行測試。 子類的測試驅動程序在繼承父類測試驅動程序的同時,要對覆蓋了父類的同名方法進行測試,而且應該重新對父類的類實例方法的所有重載形式執行一次測試。 package applet.unedu.tlpe.test;public class reload public reload()p
18、ublic int method_a()return “method_a()”;public int method_a(String a)return “method_a(String a)”;public int method_a(String a,String b)return “method_a(String a,String b)”;public int method_b()return “method_b()”;public int method_c()return “method_c()”; reload_TestCase為reload類的測試驅動程序,該類對reload類中包含的
19、method_a實例方法的三種重載形式分別進行了測試,代碼如下:/*reload_TestCase .java*/package applet.unedu.tlpe.test;public class reload_TestCase extends TestCase.public reload_TestCase(argument )public void testMethod_a()public void testMethod_a_a()public void testMethod_a_ab()public void testMethod_b()public void testMethod_c
20、() 五、異常測試 因為存在異常,在構建測試用例時,還要考慮如何測試在某種特殊情況下程序代碼是否返回了指定的狀態。 面向對象測試的層次面向對象測試的層次 在傳統軟件中,確定單元的指導方針是: 1、能夠自身編譯的最小程序塊; 2、單一過程/函數(獨立); 3、由一個人完成的小規模工作。 面向對象軟件測試與傳統方法的區別:指導方針中沒有明確說明是把類還是方法作為單元。 下面對分別以方法和類作為單元的測試進行簡單的介紹和比較。 以方法為單元 可以將面向對象單元測試歸結為傳統的單元測試。 可以使用所有傳統功能性測試和結構性測試技術。 前期工作相對容易,但后續測試工作重。 以類為單元 面向對象測試的層次
21、,取決于單元的構成,一般采用三層或四層方式。如果把單個操作或方法看作單元,則有四層測試,即操作/方法、類、繼承和系統測試。 面向對象測試的主要問題是集成測試,可以看作是第三層,即在通過測試的類之間的交互測試。 JunitJunit簡介簡介 Junit是用于測試使用Java語言編寫的面向對象程序的單元級測試工具。 (由Eric Gamma及Kent Beck編寫的,由SourceForge發行,使用許可證遵循IBMs common Public License Version 1.0公開版權規范) *優點* : 1、提升程序代碼的質量的同時,Junit測試使我們能夠更快速的編寫程序。 2、Jun
22、it使用簡單 3、Junit能夠檢驗測試結果并立即提供反饋。 4、Junit測試可以組織成一個有層次的測試系列架構。 5、使用Junit開發測試成本低。 6、Junit測試提升軟件的穩定性。 7、Junit測試是使用Java語言開發的。 8、Junit是免費的。 一、Junit的安裝和配置 (略) 二、Junit的卸載步驟 (略) 三、支持Junit的Java IDE 目前主要有 Forte for Java 3.0 Enterprise Edition; JBuilder 6 Enterprise Edition; Visual Age for Java等 。 四、Junit的各種斷言 Ju
23、nit提供了一些用于幫助我們確定某個被測試函數是否正常工作的輔助函數,通常把這些函數稱之為斷言。可以判斷某條件是否為真;兩數據是否相等。 下面舉出一些斷言方法: AssertEquals(String message,expected,actual) expected參數代表期望值;actual參數代表被測試代碼實際產生的值;message參數可選,常用于報告出錯信息。 assertNull/ assertNotNull(String message,java.lang.Object object) 用來判斷給定的對象是否為空/(是否為非空),如果答案為否,則會失敗,同樣message參數是可
24、選的。 assertSame/assertNotSame (String message,expected,actual)驗證expected參數和actual參數所引用的是否為/(不為)同一個對象,答案為否將會失敗, assertTrue(String message, boolean condition)驗證給定的二元條件是否為真,如果為假的話,將會失敗 注意:當某個斷言失敗的時候,其所在的測試方法就會停止,也就是說剩余的斷言將不會執行,此時應該先修復這個失敗的測試再繼續進行其他測試。另外,當有的測試失敗時不能給原有代碼添加新的特性!此時,應該盡快的修復這個錯誤,直到所有的測試都順利通過。
25、 五、Junit自動化測試框架 定義:就是可以對代碼進行單元測試的框架。 簡單的自動化測試框架應該滿足如下幾個要求: 1、能夠以某種方式將測試用例組織成一個測試包,以便可以一次執行所有測試用例,盡量達到讓實現人員或者測試人員按一個按鈕就能完成所有的測試工作,并且輸出清晰的測試結果的目的。2、支持簡單的操作,可以向測試包中添加任意多個測試用例,并且不影響測試包的正常運行。3、支持測試隨意組合(一個測試包可以包含其他的測試包)。 Junit的自動化測試框架如圖-9所示:TestCasesetUp()teardown()MyTestCaseTestRun()TestSuiteaddTest()圖-9
26、 Junit的自動化測試框架 Junit.Framework包中包含了Junit測試類所需的所有基類(Base Class),實際上這個包也是整個Junit的基礎框架(Base_Framework)。TestCase類是這個包的核心,測試人員可在繼承TestCase類的基礎上開發自己的測試驅動程序。其余的類用來支持TestCase類,其中的TestSuite用來聚合多個測試用例(TestCase);Assert類用來驗證期望值和實際值;TestResult類收集所有測試用例執行后的結果;在Test接口中建立了TestCase和TestSuite之間的關聯,同時它也為整個測試框架作了擴展預留。
27、下面通過一段代碼對Junit框架的使用進行簡單介紹(包含了前面介紹的斷言)。 Line 1 import junit.framework.*; /導入必需的Junit類庫 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 一個測試類會包含一些測試方法;每個方法可以包含一個或者多個斷言語句,這些功能能滿足最基本的測試要求。 但有時候希望在一個測試類中能調用其他
28、測試類,或者測試人員可能只想運行一個測試類中的某些方法。可以通過創建Test suite來實現。 例如,給出如下一個類似TestSimple的測試驅動類,二者不同之處在于增加了一個靜態的Test suite方法,通過suite()方法就可以返回任何想得到的測試集合(測試類中沒有suite()方法時,Junit會自動運行所有以test為開頭命名的方法)。代碼如下:Line 1 import junit.framework.*; 2 public class TestSimple extends TestCase 3 public TestSimple(String name) 4 super(n
29、ame); 5 6 public void testPlus()7 assertEquals(2,3-1);8 9 public void testAdd()10 assertEquals(4,2+2); public void testMultiple() assertEquals(4,22); 15 public static Test suite() TestSuite suite=new TestSuite(); Suite.addTest( new TestClassOne(“testPlus”); Suite.addTest(20 new TestClassOne(“testAdd
30、”); return suite; 六、環境的建立和清理 每個測試的運行是相互獨立的,每次測試都要重新設置某些測試環境;在測試完成之后釋放一些資源。 Junit中的TestCase基類就為我們提供了這樣兩個方法,可以分別用于環境的建立和清理: protected void setUp(); protected void teardown(); (例子詳見教材)七、JUnit支持兩種運行單個測試的方法: 靜態的和動態的方法。 1、靜態的方法是覆蓋TestCase類的runTest()方法,一般是采用內部類的方式創建一個測試實例: TestCase test01 = new testCar(tes
31、tgetWheels) public void runTest() testGetWheels(); 2、動態的方法是用內省來實現runTest()以創建一個測試實例。這要求測試的名字就是需要調用的測試方法的名字: TestCase test01 = new testCar(testGetWheels); 八、Testsuite的使用 在JUnit中,任何測試類都能包含一個名為suite的靜態方法,即:public static Test suite();在suite()方法中,將所需要的測試實例加到一個TestSuite對象中,并返回這個TestSuite對象。 因為TestSuite和Te
32、stCase都實現了Test接口,而Test接口定義了運行測試所需的方法。所以,在測試類執行的過程中,只有添加到TestSuite中的測試才能夠被運行,因此不用去運行我們暫時還不需要的測試。九、Junit中main方法的使用 使用方法如下:public static void main(String args)Junit.textui.TestRunner.run(TestdrawbhTest.class);/使用文本交互模式啟動該測試用例Junit.awtui.TestRunner.run(TestdrawbhTest.class);/使用AWT圖形交互模式啟動該測試用例Junit.swingui.TestRunner.run(Testdrawbh
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年空間搭載產品及設備項目申請報告模范
- 2024年三亞市公務員考試行測試卷歷年真題(含答案詳解)
- 2025至2030年中國右蘭索拉唑行業市場現狀分析及未來前景研判報告
- 2025年可穿戴醫療設備在康復護理領域的應用與創新研究報告
- 2025年商業地產數字化運營模式變革與客戶體驗優化策略研究報告
- B2B電子商務電子訂單融資模式下的供應鏈金融風險管控:理論、實踐與創新
- 2023-2028年中國櫥柜行業市場深度分析及未來發展趨勢預測報告
- 2020-2025年中國養豬行業競爭格局分析及投資規劃研究報告
- 2025年中國新資源食品行業市場發展監測及投資前景展望報告
- 2025年智能壓力發生器項目可行性分析報告
- 李辛演講-現代人的壓力與管理
- 自評報告中如何展示自己在疾病防控和公共衛生方面的能力
- 基于人工智能的CAD模型自動生成技術研究
- 無憂傳媒商業計劃書
- 【物流運輸合同】公司物流運輸合同
- 建設施工隱患判定和標準化檢查清單
- (完整)仰斜式擋土墻計算圖(斜基礎)
- 熱軋帶鋼板形控制
- 中國全部城市名及拼音
- 歷史九年級上冊第五單元《走向近代》作業設計 單元作業設計
- 外教社新編英語語法教程(第6版)PPT課件Unit-26
評論
0/150
提交評論