easymock教程-record-replay-verify模型
record-replay-verify 模型容許記錄mock對象上的操作然后重演并驗(yàn)證這些操作。這是目前mock框架領(lǐng)域最常見的模型,幾乎所有的mock框架都是用這個模型,有些是現(xiàn)實(shí)使用如easymock,有些是隱式使用如jmockit。
以easymock為例,典型的easymock使用案例一般如下, 援引上一章中的例子:


























在這里有兩句非常明顯的調(diào)用語句: Easymock.replay(...)和Easymock.verify(...)。這兩個語句將上述代碼分成三個部分,分別對應(yīng)record-replay-verify 3個階段
1. record






這里我們開始創(chuàng)建mock對象,并期望這個mock對象的方法被調(diào)用,同時給出我們希望這個方法返回的結(jié)果。
這就是所謂的"記錄mock對象上的操作", 同時我們也會看到"expect"這個關(guān)鍵字。
總結(jié)說,在record階段,我們需要給出的是我們對mock對象的一系列期望:若干個mock對象被調(diào)用,依從我們給定的參數(shù),順序,次數(shù)等,并返回預(yù)設(shè)好的結(jié)果(返回值或者異常).
2. replay



在replay階段,我們關(guān)注的主要測試對象將被創(chuàng)建,之前在record階段創(chuàng)建的相關(guān)依賴被關(guān)聯(lián)到主要測試對象,然后執(zhí)行被測試的方法,以模擬真實(shí)運(yùn)行環(huán)境下主要測試對象的行為。
在測試方法執(zhí)行過程中,主要測試對象的內(nèi)部代碼被執(zhí)行,同時和相關(guān)的依賴進(jìn)行交互:以一定的參數(shù)調(diào)用依賴的方法,獲取并處理返回。我們期待這個過程如我們在record階段設(shè)想的交互場景一致,即我們期望在replay階段所有在record階段記錄的行為都將被完整而準(zhǔn)確的重新演繹一遍,從而到達(dá)驗(yàn)證主要測試對象行為的目的。
3. verify





在verify階段,我們將驗(yàn)證測試的結(jié)果和交互行為。
通常驗(yàn)證分為兩部分,如上所示: 一部分是驗(yàn)證結(jié)果,即主要測試對象的測試方法返回的結(jié)果(對于異常測試場景則是拋出的異常)是否如預(yù)期,通常這個驗(yàn)證過程需要我們自行編碼實(shí)現(xiàn)。另一部分是驗(yàn)證交互行為,典型如依賴是否被調(diào)用,調(diào)用的參數(shù),順序和次數(shù),這部分的驗(yàn)證過程通常是由mock框架來自動完成,我們只需要簡單調(diào)用即可。
在easymock的實(shí)現(xiàn)中,verify的部分交互行為驗(yàn)證工作,會提前在replay階段進(jìn)行:比如未記錄的調(diào)用,調(diào)用的參數(shù)等。如果驗(yàn)證失敗,則直接結(jié)束replay以致整個測試案例。
record-replay-verify 模型非常好的滿足了大多數(shù)測試場景的需要:先指定測試的期望,然后執(zhí)行測試,再驗(yàn)證期望是否被滿足。這個模型簡單直接,易于實(shí)現(xiàn),也容易被開發(fā)人員理解和接受,因此被各個mock框架廣泛使用。
posted on 2010-10-15 14:50 sky ao 閱讀(3848) 評論(0) 編輯 收藏 所屬分類: software test