第12章 面向?qū)ο髮崿F(xiàn)_第1頁
第12章 面向?qū)ο髮崿F(xiàn)_第2頁
第12章 面向?qū)ο髮崿F(xiàn)_第3頁
第12章 面向?qū)ο髮崿F(xiàn)_第4頁
第12章 面向?qū)ο髮崿F(xiàn)_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第12章章 面向?qū)ο髮崿F(xiàn)面向?qū)ο髮崿F(xiàn)12.1 程序設(shè)計語言程序設(shè)計語言12.2 程序設(shè)計風(fēng)格程序設(shè)計風(fēng)格12.3 測試策略測試策略12.4 設(shè)計測試用例設(shè)計測試用例12.5 小結(jié)小結(jié)1n面向?qū)ο髮崿F(xiàn)與面向過程的一樣應(yīng)包括:面向?qū)ο髮崿F(xiàn)與面向過程的一樣應(yīng)包括:編碼,測試。編碼,測試。n面向?qū)ο蟮姆治龊驮O(shè)計共同的模型使它們難于分開。面向?qū)ο蟮姆治龊驮O(shè)計共同的模型使它們難于分開。n面向?qū)ο缶幊堂嫦驅(qū)ο缶幊?OOP)需要需要OOP語言語言O(shè)OLnOOL具有自己的特點和風(fēng)格。具有自己的特點和風(fēng)格。n面向?qū)ο蟪绦蛑械姆庋b、繼承和多態(tài)等機制,給測試面向?qū)ο蟪绦蛑械姆庋b、繼承和多態(tài)等機制,給測試帶來新特點,

2、增加了測試和調(diào)試的難度。帶來新特點,增加了測試和調(diào)試的難度。23n面向?qū)ο蟮脑O(shè)計適宜用面向?qū)ο蟮脑O(shè)計適宜用OOL來實現(xiàn),來實現(xiàn), 理論上也理論上也可以用非可以用非OOL實現(xiàn)但不可取。實現(xiàn)但不可取。n若用非若用非OOL編寫面向?qū)ο蟪绦颍瑒t程序員必須自編寫面向?qū)ο蟪绦颍瑒t程序員必須自己實現(xiàn)己實現(xiàn)OOL編譯程序自動提供的面向?qū)ο蟮母拍罹幾g程序自動提供的面向?qū)ο蟮母拍詈蜋C制:類,繼承,封裝。和機制:類,繼承,封裝。若有可能,應(yīng)選用若有可能,應(yīng)選用OOL。12.1 程序設(shè)計語言程序設(shè)計語言 12.1.1 面向?qū)ο笳Z言面向?qū)ο笳Z言O(shè)OL的優(yōu)點的優(yōu)點41. 一致的表示方法一致的表示方法 面向?qū)ο箝_發(fā)基于不隨

3、時間變化的、一致的表面向?qū)ο箝_發(fā)基于不隨時間變化的、一致的表示方法示方法OOOO模型:模型:OOAOOA,OODOOD,OOPOOP。2. 可重用性可重用性軟件開發(fā)組織可重用軟件開發(fā)組織可重用OOA, OOD和和OOP結(jié)果。結(jié)果。3. 可維護性可維護性 保持文檔與源程序一致的完全一致幾乎不可能。保持文檔與源程序一致的完全一致幾乎不可能。OOLOOL的可讀性的可讀性( (對象名等對象名等) ) = =可維護性可維護性。5兩大類面向?qū)ο笳Z言兩大類面向?qū)ο笳Z言:u純面向?qū)ο笳Z言純面向?qū)ο笳Z言: Smalltalk和和Eiffel等等u混合型面向?qū)ο笳Z言混合型面向?qū)ο笳Z言: 過程語言過程語言+OO,如

4、,如C+n純面向?qū)ο笳Z言著重支持面向?qū)ο蠓椒ㄑ芯亢涂旒兠嫦驅(qū)ο笳Z言著重支持面向?qū)ο蠓椒ㄑ芯亢涂焖僭偷膶崿F(xiàn)。速原型的實現(xiàn)。n混合型面向?qū)ο笳Z言的目標則是提高運行速度和混合型面向?qū)ο笳Z言的目標則是提高運行速度和使傳統(tǒng)程序員容易接受面向?qū)ο笏枷搿J箓鹘y(tǒng)程序員容易接受面向?qū)ο笏枷搿1容^面向?qū)ο笳Z言比較面向?qū)ο笳Z言/開發(fā)環(huán)境時需要考察的特點:開發(fā)環(huán)境時需要考察的特點:12.1.2 面向?qū)ο笳Z言的技術(shù)特點面向?qū)ο笳Z言的技術(shù)特點61. 支持類與對象概念的機制支持類與對象概念的機制:內(nèi)存管理內(nèi)存管理 允許用戶動態(tài)創(chuàng)建對象意味著系統(tǒng)必須處理內(nèi)允許用戶動態(tài)創(chuàng)建對象意味著系統(tǒng)必須處理內(nèi)存管理問題。存管理問題。 有

5、兩種管理內(nèi)存的方法有兩種管理內(nèi)存的方法: : 1) 1)語言的運行機制自動管理內(nèi)存,即自動回收語言的運行機制自動管理內(nèi)存,即自動回收“垃圾垃圾”的機制;的機制;( (必須采用先進的垃圾收集算法必須采用先進的垃圾收集算法) ) 2) 2)由程序員編寫釋放內(nèi)存的代碼。由程序員編寫釋放內(nèi)存的代碼。 ( (例如例如: : 程序員定義析構(gòu)函數(shù)程序員定義析構(gòu)函數(shù)(destructor)(destructor)。每當一個對象超出范圍或被顯式刪除時,就自動調(diào)每當一個對象超出范圍或被顯式刪除時,就自動調(diào)用析構(gòu)函數(shù)。這種機制使得程序員能夠方便地構(gòu)造用析構(gòu)函數(shù)。這種機制使得程序員能夠方便地構(gòu)造和喚醒釋放內(nèi)存的操作和

6、喚醒釋放內(nèi)存的操作) )72. 實現(xiàn)整體實現(xiàn)整體-部分部分(即聚集即聚集)結(jié)構(gòu)的機制結(jié)構(gòu)的機制兩種實現(xiàn)關(guān)聯(lián)方法兩種實現(xiàn)關(guān)聯(lián)方法: 指針和獨立的關(guān)聯(lián)對象指針和獨立的關(guān)聯(lián)對象 大多數(shù)現(xiàn)有的面向?qū)ο笳Z言并不顯式支持獨立大多數(shù)現(xiàn)有的面向?qū)ο笳Z言并不顯式支持獨立的關(guān)聯(lián)對象,在這種情況下,使用指針是最容易的的關(guān)聯(lián)對象,在這種情況下,使用指針是最容易的實現(xiàn)關(guān)聯(lián)的方法。實現(xiàn)關(guān)聯(lián)的方法。83. 實現(xiàn)一般實現(xiàn)一般-特殊特殊(即泛化即泛化)結(jié)構(gòu)的機制結(jié)構(gòu)的機制實現(xiàn)繼承實現(xiàn)繼承 + 解決名字沖突。解決名字沖突。 名字沖突指的是繼承多個基類可能出現(xiàn)的重名名字沖突指的是繼承多個基類可能出現(xiàn)的重名問題。問題。n某些語言拒絕

7、接受有名字沖突的程序,另一些語某些語言拒絕接受有名字沖突的程序,另一些語言提供了解決沖突的協(xié)議。言提供了解決沖突的協(xié)議。n程序員應(yīng)該盡力避免出現(xiàn)名字沖突。程序員應(yīng)該盡力避免出現(xiàn)名字沖突。94. 實現(xiàn)屬性和服務(wù)的機制實現(xiàn)屬性和服務(wù)的機制屬性的機制:屬性的機制: 支持實例連接;支持實例連接;屬性的可見性控制;屬性的可見性控制;對屬性值的約束。對屬性值的約束。服務(wù)的機制:服務(wù)的機制: 支持消息連接支持消息連接(即表達對象交互關(guān)系即表達對象交互關(guān)系) ;控制服務(wù)可見性;控制服務(wù)可見性;動態(tài)聯(lián)編。動態(tài)聯(lián)編。105. 類型檢查類型檢查強強/弱類型弱類型: 語法規(guī)定變量語法規(guī)定變量/屬性分類的嚴格性。屬性分

8、類的嚴格性。強類型優(yōu)點:強類型優(yōu)點: u一是在編譯時能發(fā)現(xiàn)程序錯誤,一是在編譯時能發(fā)現(xiàn)程序錯誤,u二是增加了優(yōu)化的可能性。二是增加了優(yōu)化的可能性。強類型有助于提高軟件的可靠性和運行效率。強類型有助于提高軟件的可靠性和運行效率。強類型宜用于開發(fā)軟件產(chǎn)品,強類型宜用于開發(fā)軟件產(chǎn)品,弱類型適于快速開發(fā)原型。弱類型適于快速開發(fā)原型。116. 類庫類庫n類庫類庫:編譯編譯/開發(fā)環(huán)境提供的重用類構(gòu)件。開發(fā)環(huán)境提供的重用類構(gòu)件。n類庫包含實現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)類庫包含實現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)(例如,動態(tài)數(shù)組、表、例如,動態(tài)數(shù)組、表、隊列、棧、樹等等隊列、棧、樹等等)的類,的類,GUI用戶界面類。用戶界面類。7. 效率效率

9、n面向?qū)ο笳Z言的主要缺點是效率低:早期解釋型面向?qū)ο笳Z言的主要缺點是效率低:早期解釋型語言語言, 動態(tài)聯(lián)編。動態(tài)聯(lián)編。n類庫中提供的算法和數(shù)據(jù)結(jié)構(gòu)更高效。類庫中提供的算法和數(shù)據(jù)結(jié)構(gòu)更高效。n與結(jié)構(gòu)化語言的效率差別可以忽略,總體上利大與結(jié)構(gòu)化語言的效率差別可以忽略,總體上利大于弊。于弊。128. 持久保存對象持久保存對象 不依賴于程序執(zhí)行的生命期而長時間保存數(shù)據(jù)不依賴于程序執(zhí)行的生命期而長時間保存數(shù)據(jù)對象的兩個原因:對象的兩個原因: (1) (1) 實現(xiàn)不同時運行程序間傳遞數(shù)據(jù)實現(xiàn)不同時運行程序間傳遞數(shù)據(jù)(2) (2) 恢復(fù)被中斷了的程序的運行恢復(fù)被中斷了的程序的運行 理想情況下,應(yīng)該使程序設(shè)計

10、語言語法與對象理想情況下,應(yīng)該使程序設(shè)計語言語法與對象存儲管理語法實現(xiàn)無縫集成。存儲管理語法實現(xiàn)無縫集成。139. 參數(shù)化類參數(shù)化類n類的數(shù)據(jù)類的數(shù)據(jù)(屬性屬性)類型可以由參數(shù)給定。類型可以由參數(shù)給定。n一個類可以對不同的數(shù)據(jù)類型施以同樣的操作。一個類可以對不同的數(shù)據(jù)類型施以同樣的操作。如對整數(shù)和實數(shù)排序。如對整數(shù)和實數(shù)排序。nEiffel 和和C+語言提供了參數(shù)化類語言提供了參數(shù)化類/類模板。類模板。10. 開發(fā)環(huán)境開發(fā)環(huán)境n軟件工具或開發(fā)環(huán)境對軟件生產(chǎn)率有很大影響。軟件工具或開發(fā)環(huán)境對軟件生產(chǎn)率有很大影響。n一個語言可有不同的編譯程序。一個語言可有不同的編譯程序。nCASE工具與語言的兼容

11、性。工具與語言的兼容性。14選擇面向?qū)ο笳Z言應(yīng)考慮的因素選擇面向?qū)ο笳Z言應(yīng)考慮的因素:1. 將來能否占主導(dǎo)地位將來能否占主導(dǎo)地位語言的生命力及穩(wěn)定性:維護的考慮。語言的生命力及穩(wěn)定性:維護的考慮。2. 可重用性可重用性影響重用的要素:封裝、繼承、多態(tài)。影響重用的要素:封裝、繼承、多態(tài)。3. 類庫和開發(fā)環(huán)境類庫和開發(fā)環(huán)境n語言、開發(fā)環(huán)境和類庫這語言、開發(fā)環(huán)境和類庫這3個因素共同決定可重用性。個因素共同決定可重用性。n類庫是否提供有價值的類?類庫是否提供有價值的類?n開發(fā)環(huán)境是否提供使用方便的類庫編輯和瀏覽工具。開發(fā)環(huán)境是否提供使用方便的類庫編輯和瀏覽工具。12.1.3 選擇面向?qū)ο笳Z言選擇面向?qū)?/p>

12、象語言154. 其他因素其他因素u在選擇編程語言時,應(yīng)該考慮的其他因素還有:在選擇編程語言時,應(yīng)該考慮的其他因素還有:對用戶學(xué)習(xí)面向?qū)ο蠓治觥⒃O(shè)計和編碼技術(shù)所能提對用戶學(xué)習(xí)面向?qū)ο蠓治觥⒃O(shè)計和編碼技術(shù)所能提供的培訓(xùn)服務(wù);供的培訓(xùn)服務(wù);u在使用這個面向?qū)ο笳Z言期間能提供的技術(shù)支持;在使用這個面向?qū)ο笳Z言期間能提供的技術(shù)支持;能提供給開發(fā)人員使用的開發(fā)工具、開發(fā)平臺、發(fā)能提供給開發(fā)人員使用的開發(fā)工具、開發(fā)平臺、發(fā)行平臺;行平臺;u對機器性能和內(nèi)存的需求;對機器性能和內(nèi)存的需求;u集成已有軟件的容易程度集成已有軟件的容易程度(調(diào)用其它語言的模塊調(diào)用其它語言的模塊)。16 為適應(yīng)面向?qū)ο蠓椒ㄋ赜械母?/p>

13、念為適應(yīng)面向?qū)ο蠓椒ㄋ赜械母拍? (例如,繼例如,繼承性承性) )而必須遵循的一些新準則。而必須遵循的一些新準則。12.2 程序設(shè)計風(fēng)格程序設(shè)計風(fēng)格17 兩種代碼重用:兩種代碼重用: 1) 本項目內(nèi)的代碼重用本項目內(nèi)的代碼重用 2) 重用舊重用舊/外項目的代碼。外項目的代碼。內(nèi)部重用內(nèi)部重用:利用繼承機制共享相同或相似的部分利用繼承機制共享相同或相似的部分12.2.1 提高可重用性提高可重用性實現(xiàn)兩類重用的程序設(shè)計準則:實現(xiàn)兩類重用的程序設(shè)計準則:1. 提高方法的內(nèi)聚提高方法的內(nèi)聚一個方法一個方法(即服務(wù)即服務(wù))只完成單個功能只完成單個功能, 否則把它分解否則把它分解成幾個更小的方法。成幾個

14、更小的方法。2. 減小方法的規(guī)模減小方法的規(guī)模把規(guī)模過大的方法把規(guī)模過大的方法(代碼長度超過一頁紙代碼長度超過一頁紙),分解成,分解成幾個更小的方法。幾個更小的方法。3. 保持方法的一致性保持方法的一致性功能相似的方法應(yīng)該有一致的名字、參數(shù)特征功能相似的方法應(yīng)該有一致的名字、參數(shù)特征(包包括參數(shù)個數(shù)、類型和次序括參數(shù)個數(shù)、類型和次序)、返回值類型、使用條、返回值類型、使用條件及出錯條件等。件及出錯條件等。184. 把策略與實現(xiàn)分開把策略與實現(xiàn)分開兩種不同類型的方法:策略與實現(xiàn)。兩種不同類型的方法:策略與實現(xiàn)。n策略方法策略方法(拼積木拼積木)調(diào)用實現(xiàn)方法調(diào)用實現(xiàn)方法(積木積木)來完成任務(wù)來完成

15、任務(wù)(實現(xiàn)圖案實現(xiàn)圖案)。n策略方法通常緊密依賴于具體應(yīng)用。策略方法通常緊密依賴于具體應(yīng)用。n實現(xiàn)方法針對具體數(shù)據(jù)完成特定處理,用于實現(xiàn)實現(xiàn)方法針對具體數(shù)據(jù)完成特定處理,用于實現(xiàn)復(fù)雜的算法。相對獨立于應(yīng)用,因此,較可能被重復(fù)雜的算法。相對獨立于應(yīng)用,因此,較可能被重用。用。這是軟件具有柔性、可裝配性的基礎(chǔ)這是軟件具有柔性、可裝配性的基礎(chǔ)195. 全面覆蓋全面覆蓋 方法的實現(xiàn)不僅滿足當前應(yīng)用而且應(yīng)該考慮其方法的實現(xiàn)不僅滿足當前應(yīng)用而且應(yīng)該考慮其它應(yīng)用的潛在需要。它應(yīng)用的潛在需要。 此外,方法對空值、極限值及界外值等異常情此外,方法對空值、極限值及界外值等異常情況也應(yīng)該能夠作出有意義的響應(yīng)。況也應(yīng)

16、該能夠作出有意義的響應(yīng)。6. 盡量不使用全局信息盡量不使用全局信息 應(yīng)該盡量降低方法與外界的耦合程度,不使用應(yīng)該盡量降低方法與外界的耦合程度,不使用全局信息,如類變量。全局信息,如類變量。207. 利用繼承機制利用繼承機制繼承是實現(xiàn)共享和提高重用的主要途徑。繼承是實現(xiàn)共享和提高重用的主要途徑。(1) 調(diào)用子過程:把公共的代碼分離出來,構(gòu)成一個調(diào)用子過程:把公共的代碼分離出來,構(gòu)成一個被其他方法調(diào)用的公用方法,被其他方法調(diào)用的公用方法, 并在基類中定義它。并在基類中定義它。(2) 分解因子。從不同類的相似方法中分解出不同的分解因子。從不同類的相似方法中分解出不同的“因子因子”(即不同的代碼即不同

17、的代碼),把余下的代碼作為公用方,把余下的代碼作為公用方法中的公共代碼,把分解出的因子作為法中的公共代碼,把分解出的因子作為名字相同名字相同(多多態(tài)性機制態(tài)性機制)算法不同的方法,放在不同類中定義,并算法不同的方法,放在不同類中定義,并被這個公用方法調(diào)用,如圖所示。被這個公用方法調(diào)用,如圖所示。21(3) 使用委托。僅當確實存在一般使用委托。僅當確實存在一般-特殊關(guān)系時,使特殊關(guān)系時,使用繼承才是恰當?shù)模駝t,可以利用委托機制,如用繼承才是恰當?shù)模駝t,可以利用委托機制,如本書本書11.11.3小節(jié)所述。小節(jié)所述。(4) 把代碼封裝在類中。把代碼封裝在類中。(與繼承無關(guān),典型用于封裝(與繼承無

18、關(guān),典型用于封裝其他軟件包功能)其他軟件包功能)把被重用的代碼封裝在類中比較安全和易于修改。把被重用的代碼封裝在類中比較安全和易于修改。22 提高可重用性的準則,也能提高程序的可擴充提高可重用性的準則,也能提高程序的可擴充性。此外,下列準則也有助于提高可擴充性:性。此外,下列準則也有助于提高可擴充性: 1. 1. 封裝實現(xiàn)策略封裝實現(xiàn)策略 把類的實現(xiàn)策略把類的實現(xiàn)策略( (包括描述屬性的數(shù)據(jù)結(jié)構(gòu)、包括描述屬性的數(shù)據(jù)結(jié)構(gòu)、修改屬性的算法等修改屬性的算法等) )封裝起來,將提高今后修改數(shù)封裝起來,將提高今后修改數(shù)據(jù)結(jié)構(gòu)或算法的自由度。據(jù)結(jié)構(gòu)或算法的自由度。12.2.2 提高可擴充性提高可擴充性23

19、2. 不要用一個方法遍歷多條關(guān)聯(lián)鏈不要用一個方法遍歷多條關(guān)聯(lián)鏈 一個方法應(yīng)該只包含對象模型中的有限內(nèi)容。一個方法應(yīng)該只包含對象模型中的有限內(nèi)容。否則將導(dǎo)致方法過分復(fù)雜,既不易理解,也不易修否則將導(dǎo)致方法過分復(fù)雜,既不易理解,也不易修改擴充。改擴充。3. 避免使用多分支語句避免使用多分支語句 可以利用可以利用DO_CASEDO_CASE語句測試對象的內(nèi)部狀態(tài),語句測試對象的內(nèi)部狀態(tài),而不要用來根據(jù)對象類型選擇應(yīng)有的行為而不要用來根據(jù)對象類型選擇應(yīng)有的行為( (強耦合強耦合) ),否則在增添新類時將不得不修改原有的代碼。應(yīng)該否則在增添新類時將不得不修改原有的代碼。應(yīng)該利用多態(tài)性機制,根據(jù)對象當前類

20、型,自動決定應(yīng)利用多態(tài)性機制,根據(jù)對象當前類型,自動決定應(yīng)有的行為。有的行為。244. 精心確定公有方法精心確定公有方法 公有方法是向公眾公布的接口。對這類方法的公有方法是向公眾公布的接口。對這類方法的修改往往會涉及許多其他類。為提高穩(wěn)定性,可修修改往往會涉及許多其他類。為提高穩(wěn)定性,可修改性,降低維護成本,必須精心選擇和定義公有方改性,降低維護成本,必須精心選擇和定義公有方法。法。 刪除、增加或修改私有方法所涉及的面要窄得刪除、增加或修改私有方法所涉及的面要窄得多,因此代價也比較低。多,因此代價也比較低。25 既應(yīng)該考慮效率,也應(yīng)該考慮健壯性。需要在既應(yīng)該考慮效率,也應(yīng)該考慮健壯性。需要在健

21、壯性與效率之間做出適當?shù)恼壑浴=研耘c效率之間做出適當?shù)恼壑浴?為提高健壯性應(yīng)該遵守以下幾條準則:為提高健壯性應(yīng)該遵守以下幾條準則:1. 1. 預(yù)防用戶的操作錯誤預(yù)防用戶的操作錯誤 軟件系統(tǒng)必須具有處理用戶操作錯誤的能力。軟件系統(tǒng)必須具有處理用戶操作錯誤的能力。任何一個接收用戶輸入數(shù)據(jù)的方法,對其接收到的任何一個接收用戶輸入數(shù)據(jù)的方法,對其接收到的數(shù)據(jù)都必須進行檢查,發(fā)現(xiàn)了錯誤,應(yīng)該給出恰當數(shù)據(jù)都必須進行檢查,發(fā)現(xiàn)了錯誤,應(yīng)該給出恰當?shù)奶崾拘畔ⅲ蕚湓俅谓邮沼脩舻妮斎搿5奶崾拘畔ⅲ蕚湓俅谓邮沼脩舻妮斎搿?2.2.3 提高健壯性提高健壯性262. 2. 檢查參數(shù)的合法性檢查參數(shù)的合法性 對

22、公有方法,尤其應(yīng)該著重檢查其參數(shù)的合法對公有方法,尤其應(yīng)該著重檢查其參數(shù)的合法性,因為調(diào)用公有方法時可能違反參數(shù)的約束條件。性,因為調(diào)用公有方法時可能違反參數(shù)的約束條件。3. 3. 不要輕易限定數(shù)據(jù)容量不要輕易限定數(shù)據(jù)容量 在設(shè)計階段,很難準確地預(yù)測出應(yīng)用系統(tǒng)中數(shù)在設(shè)計階段,很難準確地預(yù)測出應(yīng)用系統(tǒng)中數(shù)據(jù)結(jié)構(gòu)的最大容量需求。如果有必要和可能,應(yīng)該據(jù)結(jié)構(gòu)的最大容量需求。如果有必要和可能,應(yīng)該使用動態(tài)內(nèi)存分配機制。使用動態(tài)內(nèi)存分配機制。274. 4. 先測試后優(yōu)化先測試后優(yōu)化 測試程序的性能以確定是否為提高效率而進行測試程序的性能以確定是否為提高效率而進行優(yōu)化。優(yōu)化。 如果實現(xiàn)某個操作的算法有許多

23、種,則應(yīng)該綜如果實現(xiàn)某個操作的算法有許多種,則應(yīng)該綜合考慮內(nèi)存需求、速度及實現(xiàn)的簡易程度等因素,合考慮內(nèi)存需求、速度及實現(xiàn)的簡易程度等因素,經(jīng)合理折衷選定適當?shù)乃惴ā=?jīng)合理折衷選定適當?shù)乃惴ā?8 測試面向?qū)ο筌浖牟呗耘c與面向過程的策略測試面向?qū)ο筌浖牟呗耘c與面向過程的策略基本相同,但也有許多新特點。基本相同,但也有許多新特點。12.3 測試策略測試策略29n最小的可測試單元是單個封裝起來的類和對象最小的可測試單元是單個封裝起來的類和對象n測試一個類就是測試它的對象子集測試一個類就是測試它的對象子集(不可窮盡不可窮盡)n測試對象主要是測試它的操作測試對象主要是測試它的操作n不能孤立地測試單

24、個操作不能孤立地測試單個操作同一個操作在不同狀態(tài)下行為不同同一個操作在不同狀態(tài)下行為不同同一個操作在不同類中有不同的實現(xiàn)同一個操作在不同類中有不同的實現(xiàn)(多態(tài)性多態(tài)性)有必要在每個子類的語境中測試操作有必要在每個子類的語境中測試操作比面向過程更復(fù)雜比面向過程更復(fù)雜12.3.1 面向?qū)ο蟮膯卧獪y試面向?qū)ο蟮膯卧獪y試30集成集成=組裝有關(guān)聯(lián)的類組裝有關(guān)聯(lián)的類不存在層次的控制結(jié)構(gòu)不存在層次的控制結(jié)構(gòu)(隱含在類中隱含在類中)傳統(tǒng)的自頂向下傳統(tǒng)的自頂向下/自底向上的集成策略無意義。自底向上的集成策略無意義。12.3.2 面向?qū)ο蟮募蓽y試面向?qū)ο蟮募蓽y試31面向?qū)ο筌浖募蓽y試的兩種策略面向?qū)ο筌浖?/p>

25、的集成測試的兩種策略:(1) 基于線程的測試基于線程的測試(thread based testing): 把把響應(yīng)系統(tǒng)的一個輸入或一個事件所需要的那些類響應(yīng)系統(tǒng)的一個輸入或一個事件所需要的那些類(線程線程)集成起來。集成起來。(2) 基于使用的測試基于使用的測試(use based testing): 首先測首先測試獨立類試獨立類(幾乎不使用其它類的類幾乎不使用其它類的類),再測試使用獨,再測試使用獨立類的下一個層次的類(稱為依賴類)。據(jù)此依賴立類的下一個層次的類(稱為依賴類)。據(jù)此依賴關(guān)系持續(xù)下去,直至把整個軟件系統(tǒng)構(gòu)造完為止。關(guān)系持續(xù)下去,直至把整個軟件系統(tǒng)構(gòu)造完為止。集群測試(集群測試(

26、cluster testing):用精心設(shè)計的測試用:用精心設(shè)計的測試用例檢查一群相互協(xié)作的類(通過研究對象模型可以例檢查一群相互協(xié)作的類(通過研究對象模型可以確定協(xié)作類),以發(fā)現(xiàn)不同的類之間的協(xié)作錯誤。確定協(xié)作類),以發(fā)現(xiàn)不同的類之間的協(xié)作錯誤。32 和傳統(tǒng)的確認測試一樣,面向?qū)ο筌浖拇_認和傳統(tǒng)的確認測試一樣,面向?qū)ο筌浖拇_認測試也集中檢查用戶可見的動作和用戶可識別的輸測試也集中檢查用戶可見的動作和用戶可識別的輸出。出。 從動態(tài)模型和描述系統(tǒng)行為的腳本可導(dǎo)出確認從動態(tài)模型和描述系統(tǒng)行為的腳本可導(dǎo)出確認測試用例,以發(fā)現(xiàn)用戶交互需求可能錯誤的情景。測試用例,以發(fā)現(xiàn)用戶交互需求可能錯誤的情景。

27、 黑盒測試方法可用于設(shè)計確認測試用例。黑盒測試方法可用于設(shè)計確認測試用例。12.3.3 面向?qū)ο蟮拇_認測試面向?qū)ο蟮拇_認測試33 與傳統(tǒng)軟件測試不同,面向?qū)ο鬁y試關(guān)注設(shè)計與傳統(tǒng)軟件測試不同,面向?qū)ο鬁y試關(guān)注設(shè)計適當?shù)牟僮餍蛄幸詸z查類的狀態(tài)。適當?shù)牟僮餍蛄幸詸z查類的狀態(tài)。 傳統(tǒng)方法的可用性:傳統(tǒng)方法的可用性:n 白盒測試:用于類級別的測試。測試類中封裝的白盒測試:用于類級別的測試。測試類中封裝的操作,檢查類的狀態(tài)以確定是否存在錯誤。操作,檢查類的狀態(tài)以確定是否存在錯誤。n 黑盒測試:用于集成測試、確認測試。黑盒測試:用于集成測試、確認測試。12.4 設(shè)計測試用例設(shè)計測試用例34 著重測試單個類和

28、類中封裝的方法,主要有:著重測試單個類和類中封裝的方法,主要有:隨機測試、劃分測試和基于故障的測試等隨機測試、劃分測試和基于故障的測試等3 3種。種。12.4.1 測試類(單元)的方法測試類(單元)的方法1. 隨機測試隨機測試隨機選取測試隨機選取測試類操作類操作序列以測試該類對象不同的序列以測試該類對象不同的生命歷史生命歷史問題的性質(zhì)隱含了一些限制問題的性質(zhì)隱含了一些限制 例:銀行應(yīng)用系統(tǒng)的例:銀行應(yīng)用系統(tǒng)的account(account(賬戶)類有下列賬戶)類有下列操作:操作: open(open(打開),打開),setup(setup(建立),建立),deposit(deposit(存款)

29、,存款),withdraw(withdraw(取款),取款),balance(balance(余余額),額),summarize(summarize(清單),清單),creditLimit(creditLimit(透支限額)透支限額)和和close(close(關(guān)閉)。關(guān)閉)。限制:限制:必須在其他操作前打開賬戶,完成了必須在其他操作前打開賬戶,完成了全部全部操操作之后作之后才能才能(/必須必須)關(guān)閉賬戶。關(guān)閉賬戶。35一個一個account類實例的最小類實例的最小(正常正常)行為歷史包含下列操行為歷史包含下列操作:作: opensetupdepositwithdrawclose可能發(fā)生許多其

30、他行為:可能發(fā)生許多其他行為: Opensetupdeposit deposit|withdraw|balance|summarize|creditLimitn.withdrawclose從上列序列可以隨機地產(chǎn)生一系列不同的操作序列:從上列序列可以隨機地產(chǎn)生一系列不同的操作序列: #r1:opensetupdepositdepositbalancesummarize.withdrawclose#r2:opensetupdepositcreditLimitwithdrawclose也要考慮異常(用戶或編程也要考慮異常(用戶或編程)序列:序列:opensetup.withdrawclosesetu

31、pdeposit.withdrawclose362. 劃分測試劃分測試 劃分測試(劃分測試(partition testingpartition testing)可以減少測)可以減少測試用例的數(shù)量。試用例的數(shù)量。 3 3種劃分:狀態(tài)、屬性、功能。種劃分:狀態(tài)、屬性、功能。(1) 基于狀態(tài)的劃分基于狀態(tài)的劃分 根據(jù)類操作是否改變類狀態(tài)來劃分。根據(jù)類操作是否改變類狀態(tài)來劃分。 考慮考慮accountaccount類,狀態(tài)操作包括類,狀態(tài)操作包括depositdeposit和和withdrawwithdraw,而非狀態(tài)操作有,而非狀態(tài)操作有balance, summarizebalance, sum

32、marize和和creditLimitcreditLimit。 然后為每個類別設(shè)計測試序列。用例應(yīng)覆蓋各然后為每個類別設(shè)計測試序列。用例應(yīng)覆蓋各類操作的每一操作。類操作的每一操作。37(2) 基于屬性的劃分基于屬性的劃分 根據(jù)類操作使用的屬性來劃分。根據(jù)類操作使用的屬性來劃分。 對于對于accountaccount類來說,可使用屬性類來說,可使用屬性balance(balance(余余額額= =狀態(tài)狀態(tài)) ) 把操作劃分成把操作劃分成3 3個類別:個類別: 使用使用balance的操作;的操作; 修改修改balance的操作;的操作; 不使用也不修改不使用也不修改balance的操作。的操作。

33、 用重要屬性(狀態(tài))而非每個屬性來劃分。用重要屬性(狀態(tài))而非每個屬性來劃分。38(3) 基于功能的劃分基于功能的劃分 根據(jù)類操作所完成的功能來劃分。根據(jù)類操作所完成的功能來劃分。 例如,可以把例如,可以把accountaccount類中的操作分類為初始類中的操作分類為初始化操作(化操作(open,setupopen,setup),計算操作(),計算操作(deposit, deposit, withdrawwithdraw),查詢操作(),查詢操作(balance, balance, summarize,creditLimitsummarize,creditLimit)和終止操作()和終止操作

34、(closeclose)。)。393. 基于故障的測試基于故障的測試 Fault based testing Fault based testing與傳統(tǒng)的錯誤推測法類與傳統(tǒng)的錯誤推測法類似,首先推測軟件中可能有的錯誤,然后設(shè)計出最似,首先推測軟件中可能有的錯誤,然后設(shè)計出最可能發(fā)現(xiàn)這些錯誤的測試用例。可能發(fā)現(xiàn)這些錯誤的測試用例。 它的效率依靠測試人員的經(jīng)驗和直覺。它的效率依靠測試人員的經(jīng)驗和直覺。 它與面向?qū)ο蟮姆椒o關(guān)。它與面向?qū)ο蟮姆椒o關(guān)。40 集成測試用例主要針對集成測試用例主要針對類間協(xié)作進行測試。進行測試。 測試類間協(xié)作測試類間協(xié)作可運用基于使用的測試策略可運用基于使用的測試策略

35、, , 找找出相互依賴的類出相互依賴的類. . 然后設(shè)計用例觸發(fā)類間的各種交然后設(shè)計用例觸發(fā)類間的各種交互序列。互序列。 測試類協(xié)作可以測試類協(xié)作可以使用隨機測試方法和劃分測試使用隨機測試方法和劃分測試方法方法,以及,以及基于情景基于情景/ /腳本的測試和行為測試腳本的測試和行為測試來完來完成。成。 UMLUML的協(xié)作圖的協(xié)作圖能幫助我們找出相互依賴的類和能幫助我們找出相互依賴的類和交互序列。交互序列。 下圖展示了一個銀行系統(tǒng)的類協(xié)作圖。下圖展示了一個銀行系統(tǒng)的類協(xié)作圖。12.4.2 集成測試方法集成測試方法41圖圖12.3 銀行系統(tǒng)的類銀行系統(tǒng)的類-協(xié)作圖協(xié)作圖42箭頭線上的標注箭頭線上的標

36、注:協(xié)作而調(diào)用的操作協(xié)作而調(diào)用的操作1. 多類測試多類測試生成多個類的測試用例步驟:生成多個類的測試用例步驟:1) 對每個客戶對每個客戶/UI類,為其生成一系列測試序列來類,為其生成一系列測試序列來覆蓋所有操作。覆蓋所有操作。2) 對這些操作所生成的每個消息,確定接收消息的對這些操作所生成的每個消息,確定接收消息的協(xié)作類協(xié)作類/服務(wù)器對象中的對應(yīng)操作。服務(wù)器對象中的對應(yīng)操作。3)把每個)把每個2)的操作,結(jié)合進測試序列中。對每個)的操作,結(jié)合進測試序列中。對每個產(chǎn)生消息的操作,繼續(xù)產(chǎn)生消息的操作,繼續(xù)2)43例,儲戶存款,操作序列:例,儲戶存款,操作序列: ATM:cardInserted.p

37、assword.depositBank: verifyAcctverifyPINdepositReqValidationInfo : validAcct validPINAccount: deposit對對Bank類的一個測試用例設(shè)計如下:類的一個測試用例設(shè)計如下:#r4:verifyAcctBankvalidAcctValidationInfoverifyPINBankvalidPINvalidationInfodepositReqdepositaccount44 多個類的劃分測試方法類似于單個類。多個類的劃分測試方法類似于單個類。 另一種劃分測試方法,根據(jù)與特定類的接口來另一種劃分測試方法

38、,根據(jù)與特定類的接口來劃分類操作。劃分類操作。nBank類接收來自類接收來自ATM類和類和Cashier類的消息,類的消息,n可以把可以把Bank類中的方法劃分成服務(wù)于類中的方法劃分成服務(wù)于ATM和和Cashier的兩類來測試它們。的兩類來測試它們。452. 從動態(tài)模型導(dǎo)出測試用例從動態(tài)模型導(dǎo)出測試用例 類的狀態(tài)圖可以幫助我們導(dǎo)出測試該類(及與類的狀態(tài)圖可以幫助我們導(dǎo)出測試該類(及與其協(xié)作的那些類)的動態(tài)行為的測試用例。其協(xié)作的那些類)的動態(tài)行為的測試用例。46設(shè)計出的測試用例至少應(yīng)該覆蓋所有狀態(tài):設(shè)計出的測試用例至少應(yīng)該覆蓋所有狀態(tài): #s1:opensetupAccntdeposit(in

39、itial)withdraw(final)close導(dǎo)出更多測試用例,以保證所有行為都被測試:導(dǎo)出更多測試用例,以保證所有行為都被測試:#s2:opensetupAccntdeposit(initial)depositbalancecreditwithdraw(final)close#s3:opensetupAccntdeposit(initial)depositwithdrawaccntInfowithdraw(final)close類似于傳統(tǒng)方法中的路徑覆蓋類似于傳統(tǒng)方法中的路徑覆蓋在多個類協(xié)作的情況下,應(yīng)該使用多個狀態(tài)圖。在多個類協(xié)作的情況下,應(yīng)該使用多個狀態(tài)圖。47n面向?qū)ο笤O(shè)計原則上

40、不依賴于特定的實現(xiàn)環(huán)境,面向?qū)ο笤O(shè)計原則上不依賴于特定的實現(xiàn)環(huán)境,n但實現(xiàn)結(jié)果和成本卻取決于實現(xiàn)環(huán)境。但實現(xiàn)結(jié)果和成本卻取決于實現(xiàn)環(huán)境。n支持面向?qū)ο笤O(shè)計范式的程序語言、開發(fā)環(huán)境及支持面向?qū)ο笤O(shè)計范式的程序語言、開發(fā)環(huán)境及類庫,對于面向?qū)ο蟮膶崿F(xiàn)非常重要。類庫,對于面向?qū)ο蟮膶崿F(xiàn)非常重要。n具有方便的開發(fā)環(huán)境和豐富的類庫的面向?qū)ο蟪叹哂蟹奖愕拈_發(fā)環(huán)境和豐富的類庫的面向?qū)ο蟪绦蛟O(shè)計語言,是實現(xiàn)面向?qū)ο笤O(shè)計的最佳選擇。序設(shè)計語言,是實現(xiàn)面向?qū)ο笤O(shè)計的最佳選擇。n良好的程序設(shè)計風(fēng)格對于面向?qū)ο髮崿F(xiàn)來說同樣良好的程序設(shè)計風(fēng)格對于面向?qū)ο髮崿F(xiàn)來說同樣重要。重要。n傳統(tǒng)的程序設(shè)計風(fēng)格準則依然成立,面向?qū)ο?/p>

41、方傳統(tǒng)的程序設(shè)計風(fēng)格準則依然成立,面向?qū)ο蠓椒ㄟ€有一些新準則。法還有一些新準則。12.5 小結(jié)小結(jié)48n面向?qū)ο鬁y試的策略和技術(shù)與傳統(tǒng)測試有所不同,面向?qū)ο鬁y試的策略和技術(shù)與傳統(tǒng)測試有所不同,對象類成為測試的焦點。對象類成為測試的焦點。n測試類時使用的方法主要有隨機測試、劃分測試測試類時使用的方法主要有隨機測試、劃分測試和基于故障的測試。每種方法都測試類中封裝的操和基于故障的測試。每種方法都測試類中封裝的操作。每種操作要在不同的對象狀態(tài)(由對象的屬性作。每種操作要在不同的對象狀態(tài)(由對象的屬性值表示)下測試。值表示)下測試。n可以采用基于線程或基于使用的策略完成集成測可以采用基于線程或基于使用

42、的策略完成集成測試。試。n從動態(tài)模型導(dǎo)出的測試用例,可以測試指定的類從動態(tài)模型導(dǎo)出的測試用例,可以測試指定的類及其協(xié)作者。及其協(xié)作者。n面向?qū)ο笙到y(tǒng)的確認測試可以用傳統(tǒng)的黑盒方法面向?qū)ο笙到y(tǒng)的確認測試可以用傳統(tǒng)的黑盒方法完成。完成。n情景情景/腳本為系統(tǒng)確認測試提供了用例。腳本為系統(tǒng)確認測試提供了用例。49Test Tools CASE tool index - Quite a comprehensive list of CASE Tools Old site: http:/www.cs.queensu.ca/Software-Engineering/toolcat.html 400 categories; 10% for test List of Test related tools50LOGISCOPE LOGISCOPE: Software Quality, Testing, Maintenance and Reverse-Engineering http:/ VERILOG IBM Rational Performance Tester 和和 HP Mercury LoadRunner 的比較的比較 http:/ 51Mercury Inter

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論