<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sky's blog

    我和我追逐的夢

    常用鏈接

    統計

    其他鏈接

    友情鏈接

    最新評論

    easymock教程-record-replay-verify模型

        record-replay-verify 模型容許記錄mock對象上的操作然后重演并驗證這些操作。這是目前mock框架領域最常見的模型,幾乎所有的mock框架都是用這個模型,有些是現實使用如easymock,有些是隱式使用如jmockit。

        以easymock為例,典型的easymock使用案例一般如下, 援引上一章中的例子:

     

    public class UserServiceImplTest {

    /**
         * this is a classic test case to use EasyMock.
         
    */

        @Test
        
    public void testQuery() {
            User expectedUser 
    = new User();
            expectedUser.setId(
    "1001");
            expectedUser.setAge(
    30);
            expectedUser.setName(
    "user-1001");
            UserDao userDao  
    = EasyMock.createMock(UserDao.class);
            EasyMock.expect(userDao.getById(
    "1001")).andReturn(expectedUser);
            EasyMock.replay(userDao);

            UserServiceImpl  service 
    = new UserServiceImpl();
            service.setUserDao(userDao);
            User user 
    = service.query("1001");
            assertNotNull(user);
            assertEquals(
    "1001", user.getId()); 
            assertEquals(
    30, user.getAge()); 
            assertEquals(
    "user-1001", user.getName()); 

            EasyMock.verify(userDao);
        }

    }



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

        1. record

            User expectedUser = new User();
            expectedUser.setId(
    "1001");
            expectedUser.setAge(
    30);
            expectedUser.setName(
    "user-1001");
            UserDao userDao  
    = EasyMock.createMock(UserDao.class);
            EasyMock.expect(userDao.getById(
    "1001")).andReturn(expectedUser);

     

        這里我們開始創建mock對象,并期望這個mock對象的方法被調用,同時給出我們希望這個方法返回的結果。

        這就是所謂的"記錄mock對象上的操作", 同時我們也會看到"expect"這個關鍵字。

        總結說,在record階段,我們需要給出的是我們對mock對象的一系列期望:若干個mock對象被調用,依從我們給定的參數,順序,次數等,并返回預設好的結果(返回值或者異常).

        2. replay

     

            UserServiceImpl  service = new UserServiceImpl();
            service.setUserDao(userDao);
            User user 
    = service.query("1001");


        在replay階段,我們關注的主要測試對象將被創建,之前在record階段創建的相關依賴被關聯到主要測試對象,然后執行被測試的方法,以模擬真實運行環境下主要測試對象的行為。

        在測試方法執行過程中,主要測試對象的內部代碼被執行,同時和相關的依賴進行交互:以一定的參數調用依賴的方法,獲取并處理返回。我們期待這個過程如我們在record階段設想的交互場景一致,即我們期望在replay階段所有在record階段記錄的行為都將被完整而準確的重新演繹一遍,從而到達驗證主要測試對象行為的目的。

     3. verify

            assertNotNull(user);
            assertEquals(
    "1001", user.getId()); 
            assertEquals(
    30, user.getAge()); 
            assertEquals(
    "user-1001", user.getName()); 
            EasyMock.verify(userDao);

     

        在verify階段,我們將驗證測試的結果和交互行為。

        通常驗證分為兩部分,如上所示: 一部分是驗證結果,即主要測試對象的測試方法返回的結果(對于異常測試場景則是拋出的異常)是否如預期,通常這個驗證過程需要我們自行編碼實現。另一部分是驗證交互行為,典型如依賴是否被調用,調用的參數,順序和次數,這部分的驗證過程通常是由mock框架來自動完成,我們只需要簡單調用即可。

        在easymock的實現中,verify的部分交互行為驗證工作,會提前在replay階段進行:比如未記錄的調用,調用的參數等。如果驗證失敗,則直接結束replay以致整個測試案例。

        record-replay-verify 模型非常好的滿足了大多數測試場景的需要:先指定測試的期望,然后執行測試,再驗證期望是否被滿足。這個模型簡單直接,易于實現,也容易被開發人員理解和接受,因此被各個mock框架廣泛使用。


    posted on 2010-10-15 14:50 sky ao 閱讀(3841) 評論(0)  編輯  收藏 所屬分類: software test

    主站蜘蛛池模板: 亚洲人成中文字幕在线观看| 四虎在线视频免费观看视频| 精品亚洲一区二区| 5555在线播放免费播放| 国产v亚洲v天堂a无| 亚洲国产成人爱av在线播放| 亚洲国产精品VA在线看黑人| 九九精品成人免费国产片| 成年18网站免费视频网站| 亚洲丰满熟女一区二区v| 一个人看的www视频免费在线观看 一个人看的免费观看日本视频www | 亚洲成年人免费网站| 在线中文高清资源免费观看| 亚洲国产精品午夜电影| 亚洲午夜久久久影院伊人| 亚洲色图黄色小说| 国产一区二区三区在线观看免费| 好紧我太爽了视频免费国产| 亚洲永久在线观看| 亚洲成A人片在线观看无码3D| a级特黄毛片免费观看| 91情国产l精品国产亚洲区| 国产午夜无码精品免费看动漫| 免费大片av手机看片| 久久久久亚洲精品美女| 国产禁女女网站免费看| 亚洲动漫精品无码av天堂| 中文字幕专区在线亚洲| 两性色午夜免费视频| 亚洲91精品麻豆国产系列在线 | 在线观看免费视频网站色| 国产视频精品免费视频| 成人a视频片在线观看免费| 少妇太爽了在线观看免费视频| 国产亚洲精品美女2020久久| 亚洲综合精品网站在线观看| 国产美女无遮挡免费视频网站| 亚洲成人福利网站| 中文字幕无码免费久久| AV在线播放日韩亚洲欧| 四虎免费永久在线播放|