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 閱讀(3846) 評論(0)  編輯  收藏 所屬分類: software test

          主站蜘蛛池模板: 潮安县| 罗定市| 绥中县| 保靖县| 田东县| 泽州县| 郓城县| 彩票| 阜宁县| 陆河县| 溧阳市| 宣化县| 龙泉市| 宁德市| 绥中县| 邢台县| 顺义区| 纳雍县| 东莞市| 吉林市| 亚东县| 贺州市| 扎赉特旗| 白朗县| 金湖县| 安龙县| 长丰县| 巴中市| 大连市| 大理市| 二连浩特市| 凯里市| 平湖市| 怀宁县| 商水县| 防城港市| 盐池县| 额尔古纳市| 湖南省| 年辖:市辖区| 靖宇县|