qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          EasyMock構建單元測試

           1. 背景
            單元測試作為程序的基本保障。很多時候構建測試場景是一件令人頭疼的事。因為之前的單元測試都是內部代碼引用的,環境自給自足。開發到了一定程度,你不得不到開始調用外部的接口來完成你的功能。而外部條件是不穩定的。你為了模擬外部環境要創建各種文件、各種數據。嚴重影響到單元測試的效率。EasyMock應運而生,他提供了模擬的接口和類。不用費神去構建各種煩人的環境,就能開展有效的測試。
            2. 準備環境
            Easymock 3.2 + JUnit 4.11
            3. 構建測試
            a) 實際場景
            i. 你負責開發一個會計師的功能。但計算個人所得稅的接口由外部提供(鬼知道項目經理是怎么想的)。
            ii. 你的代碼已經開發完成了。負責開發個人所得稅的接口的同事老婆生了四胞胎,天天請假帶孩子。接口沒寫完。
            iii. 你要完成你的代碼并提交測試用例。前提你個懶鬼,半點額外工作都不想做。同事老婆生孩子又不能去催。然后你在網上找到了EasyMock.......
            b) 測試代碼
            i. 個人所得稅的接口
          /**
          * Copyright ? 2008-2013, WheatMark, All Rights Reserved
          */
          package com.fitweber.wheat.interfaces;
          /**
          * 計算個人所得稅
          * @author wheatmark hajima11@163.com
          * @Blog http://blog.csdn.net/super2007
          * @version 1.00.00
          * @project wheatMock
          * @file com.fitweber.wheat.interfaces.IPersonalIncomeTax.java
          * @bulidDate 2013-9-1
          * @modifyDate 2013-9-1
          * <pre>
          *    修改記錄
          *    修改后版本:     修改人:  修改日期:     修改內容:
          * </pre>
          */
          public interface IPersonalIncomeTax {
          /**
          * 計算個人所得稅,國內,2013年7級稅率
          * @param income
          * @param deductedBeforeTax
          * @return
          */
          public double calculate(double income,double deductedBeforeTax);
          }
            ii. 會計師類中計算工資方法
          /**
          * Copyright ? 2008-2013, WheatMark, All Rights Reserved
          */
          package com.fitweber.wheat;
          import com.fitweber.wheat.interfaces.IPersonalIncomeTax;
          /**
          * 會計師類
          * @author wheatmark hajima11@163.com
          * @Blog http://blog.csdn.net/super2007
          * @version 1.00.00
          * @project wheatMock
          * @file com.fitweber.wheat.Accountant.java
          * @bulidDate 2013-9-1
          * @modifyDate 2013-9-1
          * <pre>
          *    修改記錄
          *    修改后版本:     修改人:  修改日期:     修改內容:
          * </pre>
          */
          public class Accountant {
          private IPersonalIncomeTax personalIncomeTax;
          public Accountant(){
          }
          public double calculateSalary(double income){
          //稅前扣除,五險一金中個人扣除的項目。8%的養老保險,2%的醫療保險,1%的失業保險,8%的住房公積金
          double deductedBeforeTax = income*(0.08+0.02+0.01+0.08);
          return income - deductedBeforeTax - personalIncomeTax.calculate(income,deductedBeforeTax);
          }
          /**
          * @return the personalIncomeTax
          */
          public IPersonalIncomeTax getPersonalIncomeTax() {
          return personalIncomeTax;
          }
          /**
          * @param personalIncomeTax the personalIncomeTax to set
          */
          public void setPersonalIncomeTax(IPersonalIncomeTax personalIncomeTax) {
          this.personalIncomeTax = personalIncomeTax;
          }
          }
            iii. 測試會計師類中計算工資方法
            或許你不知道個人所得稅的計算方式。但是你可以去百度一下。對,百度上有個人所得稅計算器。和2011年出臺的個人所得稅階梯稅率。
            通過百度的幫忙(更多的時候你要求助于業務組的同事)你可以確認如果你同事的個人所得稅的計算接口正確的話,傳入國內實際收入8000.00,稅前扣除1520.00。應該返回193.00的扣稅額。然后我們可以設置我們的Mock對象的行為來模仿接口的傳入和返回。用斷言來確認會計師的計算工資的邏輯。完成了我們的測試用例。
          /**
          * Copyright ? 2008-2013, WheatMark, All Rights Reserved
          */
          package com.fitweber.wheat.test;
          import static org.easymock.EasyMock.*;
          import junit.framework.Assert;
          import org.easymock.IMocksControl;
          import org.junit.After;
          import org.junit.Before;
          import org.junit.Test;
          import com.fitweber.wheat.Accountant;
          import com.fitweber.wheat.interfaces.IPersonalIncomeTax;
          /**
          * 會計師測試類
          * @author wheatmark hajima11@163.com
          * @Blog http://blog.csdn.net/super2007
          * @version 1.00.00
          * @project wheatMock
          * @file com.fitweber.wheat.test.AccountantTest.java
          * @bulidDate 2013-9-1
          * @modifyDate 2013-9-1
          * <pre>
          *    修改記錄
          *    修改后版本:     修改人:  修改日期:     修改內容:
          * </pre>
          */
          public class AccountantTest {
          private IPersonalIncomeTax personalIncomeTax;
          private Accountant accountant;
          /**
          * @throws java.lang.Exception
          */
          @Before
          public void setUp() throws Exception {
          IMocksControl control = createControl();
          personalIncomeTax = control.createMock(IPersonalIncomeTax.class);
          accountant = new Accountant();
          accountant.setPersonalIncomeTax(personalIncomeTax);
          }
          /**
          * @throws java.lang.Exception
          */
          @After
          public void tearDown() throws Exception {
          System.out.println("----------AccountantTest中的全部用例測試完畢---------");
          }
          @Test
          public void testCalculateSalary(){
          //個人所得稅的計算接口還沒實現,但會計師的計算工資的方法已經寫好了。需要測試。
          //我們可以先Mock一個出來測試。
          //個人所得稅的計算接口正確的話,傳入實際收入8000.00,稅前扣除1520.00。應該返回193.00.
          expect(personalIncomeTax.calculate(8000.00,1520.00)).andReturn(193.00);
          //設置到回放狀態
          replay(personalIncomeTax);
          //驗證計算工資方法計算是否正確。
          Assert.assertEquals(8000.00-1520.00-193.00, accountant.calculateSalary(8000.00));
          verify(personalIncomeTax);
          }
          }

          4. 執行測試
            最后是最簡單的一步了。右鍵點擊AccountantTest.java,Run As —> JUnit Test。得到下面的成功界面。
            PS:到上面一步,單元測試已經是完成了。擁有好奇心的你還可以testCalculateSalary()方法里的數值去看看如果單元測試不通過會報什么錯。
            比如,改一下所傳的參數personalIncomeTax.calculate(8000.00,1520.00)變為personalIncomeTax.calculate(9000.00,1520.00)。
            改一下斷言什么的,報錯又會是什么。Assert.assertEquals(8000.00-1520.00-193.00, accountant.calculateSalary(8000.00));
            具體的EasyMock文檔在網絡上已經漫天飛。自己去找找,深入了解下EasyMock。

          posted on 2014-12-22 23:43 順其自然EVO 閱讀(410) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 天峨县| 南投市| 永川市| 平顶山市| 桑植县| 肥东县| 咸阳市| 满洲里市| 突泉县| 马边| 伽师县| 扎囊县| 连州市| 金门县| 陆丰市| 政和县| 澜沧| 咸宁市| 广丰县| 集贤县| 加查县| 京山县| 新绛县| 壤塘县| 友谊县| 马山县| 阿勒泰市| 桃江县| 刚察县| 肥西县| 南雄市| 洱源县| 鄂温| 大丰市| 临桂县| 澄迈县| 巫溪县| 崇左市| 龙门县| 兴仁县| 岚皋县|