我和我追逐的夢
record-replay-verify 模型容許記錄mock對象上的操作然后重演并驗證這些操作。這是目前mock框架領域最常見的模型,幾乎所有的mock框架都是用這個模型,有些是現實使用如easymock,有些是隱式使用如jmockit。
以easymock為例,典型的easymock使用案例一般如下, 援引上一章中的例子:
在這里有兩句非常明顯的調用語句: Easymock.replay(...)和Easymock.verify(...)。這兩個語句將上述代碼分成三個部分,分別對應record-replay-verify 3個階段
1. record
這里我們開始創建mock對象,并期望這個mock對象的方法被調用,同時給出我們希望這個方法返回的結果。
這就是所謂的"記錄mock對象上的操作", 同時我們也會看到"expect"這個關鍵字。
總結說,在record階段,我們需要給出的是我們對mock對象的一系列期望:若干個mock對象被調用,依從我們給定的參數,順序,次數等,并返回預設好的結果(返回值或者異常).
2. replay
在replay階段,我們關注的主要測試對象將被創建,之前在record階段創建的相關依賴被關聯到主要測試對象,然后執行被測試的方法,以模擬真實運行環境下主要測試對象的行為。
在測試方法執行過程中,主要測試對象的內部代碼被執行,同時和相關的依賴進行交互:以一定的參數調用依賴的方法,獲取并處理返回。我們期待這個過程如我們在record階段設想的交互場景一致,即我們期望在replay階段所有在record階段記錄的行為都將被完整而準確的重新演繹一遍,從而到達驗證主要測試對象行為的目的。
3. verify
在verify階段,我們將驗證測試的結果和交互行為。
通常驗證分為兩部分,如上所示: 一部分是驗證結果,即主要測試對象的測試方法返回的結果(對于異常測試場景則是拋出的異常)是否如預期,通常這個驗證過程需要我們自行編碼實現。另一部分是驗證交互行為,典型如依賴是否被調用,調用的參數,順序和次數,這部分的驗證過程通常是由mock框架來自動完成,我們只需要簡單調用即可。
在easymock的實現中,verify的部分交互行為驗證工作,會提前在replay階段進行:比如未記錄的調用,調用的參數等。如果驗證失敗,則直接結束replay以致整個測試案例。
record-replay-verify 模型非常好的滿足了大多數測試場景的需要:先指定測試的期望,然后執行測試,再驗證期望是否被滿足。這個模型簡單直接,易于實現,也容易被開發人員理解和接受,因此被各個mock框架廣泛使用。
posted on 2010-10-15 14:50 sky ao 閱讀(3841) 評論(0) 編輯 收藏 所屬分類: software test
Powered by: BlogJava Copyright © sky ao