軟件評測師教程(第7章):面向對象的軟件測試技術
1 面向對象概述
OOP(面向對象編程)減少了編寫代碼的總量,卻不一定提高了軟件的質量。例如,某個類被修改了,那么所有依賴該類的代碼都必須重新測試。因此就需要一些新的測試理念和測試方法了。
2 面向對象技術
2.1 什么是對象和類
對象:萬物皆對象
類:實現抽象類型的工具
實例:類的某一個具體實現
過程式編程語言:程序=算法+數據
面向對象編程語言:程序=對象+消息
2.2 封裝,繼承和多態
- 封裝:把數據和操作結合為一體,構成的一個具有類類型的對象的描述。使程序更加緊湊,同時避免數據紊亂帶來的調試和維護的困難。
- 繼承:增加了程序的可擴充性,並為代碼重用提供了強有力的手段。
- 多態:使程序員在設計程序時可以對問題進行更好的抽象,易設計出重用性和維護性俱佳的程序。
封裝的特點:
- 一個對象應具有明確的功能,並且有一個或幾個接口以便和其他對象相互作用。
- 對象的內部實現(數據和操作)是受保護的,外界不能訪問它們。只有對象中的代碼才能訪問該對象的內部數據。這稱為數據隱藏。
- 封裝簡化了程序員對對象的使用,只需要輸入是什么,輸出是什么,而對類內部進行了什么操作不必追究。
繼承的特點
- 繼承可以從一個類派生另一個類
- 派生的類繼承了其子類和祖父類的數據成員和成員函數。
- 派生類可以增加新的屬性和新的操作。
- 派生類繼承的成員函數不合適時可以不用。
多態的特點
- 多態性就是多種表現形式
- 一個對外接口,多種表現形式
- 多態的實現,一般通過在派生類中重定義基類的虛函數來實現。(C++的虛函數)
由於面向對象軟件獨有的多態、繼承、封裝等特點,使OOP程序設計比傳統語言設計產生錯誤的可能性更大。因此也需要一種面向對象的測試模型。
3 面向對象測試模型
面向對象的開發模型突破了傳統的瀑布模型,將開發分為面向對象分析(OOA),面向對象設計(OOD),面向對象編程(OOP)三階段。
結合傳統的測試步驟的划分,我們把面向對象的軟件測試分為:面向對象分析的測試,面向對象設計的測試,面向對象編程的測試,面向對象單元測試,面向對象集成測試,面向對象確認和系統測試。
4 面向對象軟件的測試策略
4.1 OOA的測試
把E-R圖和語義網絡模型,即信息造型中的概念,與面向對象程序設計語言中的重要概念結合在一起而形成的分析方法。
- 對認定的對象測試:對象是否全面等
- 對認定的結構測試:分類結構和組裝結構
- 對認定的主題測試
- 對定義的屬性和實例關聯的測試
- 對定義的服務和消息關聯的測試
4.2 OOD的測試
以OOA為基礎歸納出類,並建立類結構或進一步構造成類庫,以實現分析結果對問題空間的抽象。OOD歸納的類即可以是對象簡單的延續,也可以是不同對象的相同或相似的服務。因此OOD是OOA進一步細化和更高層的抽象。
- 對認定的類測試
- 對構造的類層次結構的測試
- 對類庫的支持的測試
4.3 OOP的測試
面向對象程序是把功能的實現分布在類中,能正確實現功能的類,通過消息傳遞來協同實現設計要求的功能。正是這種面向對象程序風格,將出現的錯誤能精確地確定在某一具體的類。因此,在面向對象編程(OOP)階段,忽略類功能實現的細則,將測試的目光集中在類功能的實現和相應的面向對象程序風格上,主要體現為兩個方向(假設編程語言為C++)。
- 數據成員是否滿足數據封裝的要求
基本原則:數據成員是否被外界(數據成員所屬的類或子類以外的調用)直接調用。即改變數據成員的結構時,是否影響了類的對外接口,是否會導致相應的外界必須改掉。
注意點:有時強制類型轉換會破壞數據的封裝特性。
- 類是否實現了要求的功能
類所實現的功能都是通過類的成員函數執行的,測試類的功能實現時,應該首先保證類成員函數的正確性。可以用單元測試進行驗證。
類成員函數見的作用和類之間的服務調用時單元測試無法確定的,因此需要進行面向對象的集成測試。
4.4 面向對象的單元測試
一些傳統的測試方法在面向對象的單元測試中都可以使用。如等價類划分法,因果圖法,邊界值分析法,邏輯覆蓋法、路徑分析法,程序插裝法等。難度較小,一般由程序員完成。
4.5 面向對象的集成測試
對OO軟件的集成測試有兩種不同的策略,第一種稱為基於線程的測試(thread based testing);第二種稱為基於使用的測試(use based testing)。
面向對象的集成測試分為兩步:先進行靜態測試,再進行動態測試。
靜態測試主要針對程序的結構進行,檢測程序結構是否符合設計要求。通過源程序得到類關系圖和函數功能調用關系圖。
動態測試設計測試用例時,需要上述的功能調用結構圖、類關系圖或者實體關系圖,確定不需要重復測試的部分,從而優化測試用例,減少測試工作量,使得進行的測試能夠達到一定覆蓋標准。
覆蓋標准是:
- 達到類所有的服務要求或服務提供的一定覆蓋率;
- 依據類間傳遞的消息,達到對所有執行線程的一定覆蓋率;
- 達到類的所有狀態的一定覆蓋率;
- 使用現有工具來得到程序代碼執行的覆蓋率。
具體的設計用例的步驟:
1)先選定檢測的類,確定出類的相應狀態、相應行為,類和成員函數間傳遞的消息,輸入或輸出的界定。
2)確定覆蓋標准
3)利用結構關系圖確定待測類的所有關聯
4)根據程序中類的對象構造測試用例,確認什么輸入激發類的狀態,使用類的服務和期望產生什么行為等。
5)設計異常輸入,確定是否有不合法的行為發生等。
4.6 面向對象軟件的確認和系統測試
盡量搭建與用戶實際使用環境相同的測試平台,應該保證被測系統的完整性,對暫時沒有的系統設備部件,應采用相應的模擬手段。
OO軟件確認和系統測試具體的測試內容與傳統系統測試基本相同,包括:功能測試、強度測試、性能測試、安全測試、恢復測試、易用性測試、安裝/卸載測試等。
5 面向對象軟件測試用例設計
關注於設計合適的操作序列以測試類的狀態。
Berard提出了一些測試用例的設計方法,主要原則如下:
- 對每個測試用例應當給予特殊的標識,並且還應當與測試的類有明確的聯系。
- 測試目的應當明確。
- 應當為每個測試用例開發一個測試步驟列表,列表包含以下內容
- 列出所要測試的對象的專門說明
- 列出要做為測試結果運行的消息和操作
- 列出測試對象可能發生的例外情況
- 列出外部條件
- 列出為了幫助理解和實現測試所需要的附加信息。
5.1 傳統測試用例設計方法的可用性
盡管OO軟件的局限性、封裝性、信息隱藏、繼承性和對象的抽象這些特性使得測試用例設計帶來了額外的麻煩和困難,但是黑盒測試技術不僅僅適用於傳統軟件,也適用於OO軟件測試。白盒測試也用於OO軟件類的操作定義。