qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          EasyMock構(gòu)建單元測試

           1. 背景
            單元測試作為程序的基本保障。很多時候構(gòu)建測試場景是一件令人頭疼的事。因為之前的單元測試都是內(nèi)部代碼引用的,環(huán)境自給自足。開發(fā)到了一定程度,你不得不到開始調(diào)用外部的接口來完成你的功能。而外部條件是不穩(wěn)定的。你為了模擬外部環(huán)境要創(chuàng)建各種文件、各種數(shù)據(jù)。嚴(yán)重影響到單元測試的效率。EasyMock應(yīng)運(yùn)而生,他提供了模擬的接口和類。不用費(fèi)神去構(gòu)建各種煩人的環(huán)境,就能開展有效的測試。
            2. 準(zhǔn)備環(huán)境
            Easymock 3.2 + JUnit 4.11
            3. 構(gòu)建測試
            a) 實際場景
            i. 你負(fù)責(zé)開發(fā)一個會計師的功能。但計算個人所得稅的接口由外部提供(鬼知道項目經(jīng)理是怎么想的)。
            ii. 你的代碼已經(jīng)開發(fā)完成了。負(fù)責(zé)開發(fā)個人所得稅的接口的同事老婆生了四胞胎,天天請假帶孩子。接口沒寫完。
            iii. 你要完成你的代碼并提交測試用例。前提你個懶鬼,半點額外工作都不想做。同事老婆生孩子又不能去催。然后你在網(wǎng)上找到了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>
          *    修改記錄
          *    修改后版本:     修改人:  修改日期:     修改內(nèi)容:
          * </pre>
          */
          public interface IPersonalIncomeTax {
          /**
          * 計算個人所得稅,國內(nèi),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>
          *    修改記錄
          *    修改后版本:     修改人:  修改日期:     修改內(nèi)容:
          * </pre>
          */
          public class Accountant {
          private IPersonalIncomeTax personalIncomeTax;
          public Accountant(){
          }
          public double calculateSalary(double income){
          //稅前扣除,五險一金中個人扣除的項目。8%的養(yǎng)老保險,2%的醫(yī)療保險,1%的失業(yè)保險,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年出臺的個人所得稅階梯稅率。
            通過百度的幫忙(更多的時候你要求助于業(yè)務(wù)組的同事)你可以確認(rèn)如果你同事的個人所得稅的計算接口正確的話,傳入國內(nèi)實際收入8000.00,稅前扣除1520.00。應(yīng)該返回193.00的扣稅額。然后我們可以設(shè)置我們的Mock對象的行為來模仿接口的傳入和返回。用斷言來確認(rèn)會計師的計算工資的邏輯。完成了我們的測試用例。
          /**
          * 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>
          *    修改記錄
          *    修改后版本:     修改人:  修改日期:     修改內(nèi)容:
          * </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(){
          //個人所得稅的計算接口還沒實現(xiàn),但會計師的計算工資的方法已經(jīng)寫好了。需要測試。
          //我們可以先Mock一個出來測試。
          //個人所得稅的計算接口正確的話,傳入實際收入8000.00,稅前扣除1520.00。應(yīng)該返回193.00.
          expect(personalIncomeTax.calculate(8000.00,1520.00)).andReturn(193.00);
          //設(shè)置到回放狀態(tài)
          replay(personalIncomeTax);
          //驗證計算工資方法計算是否正確。
          Assert.assertEquals(8000.00-1520.00-193.00, accountant.calculateSalary(8000.00));
          verify(personalIncomeTax);
          }
          }

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

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

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

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 成都市| 民丰县| 拉孜县| 辽阳市| 阿巴嘎旗| 大石桥市| 扎兰屯市| 开平市| 东乡族自治县| 汾阳市| 资阳市| 怀仁县| 嘉祥县| 通渭县| 承德县| 休宁县| 肥西县| 宁德市| 牡丹江市| 双桥区| 镇远县| 从江县| 黄冈市| 凤台县| 达尔| 隆化县| 高州市| 赤峰市| 璧山县| 巴林右旗| 贵德县| 宜春市| 昌平区| 靖西县| 彰武县| 庐江县| 临沭县| 巧家县| 吐鲁番市| 大田县| 平江县|