您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > junit
JUnit中的測(cè)試套件和參數(shù)化測(cè)試
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2014/12/17 14:59:16 ] 推薦標(biāo)簽:junit 單元測(cè)試 軟件測(cè)試

  JUnit4.X的參數(shù)化測(cè)試
  為保證單元測(cè)試的嚴(yán)謹(jǐn)性,通常會(huì)模擬不同的測(cè)試數(shù)據(jù)來(lái)測(cè)試方法的處理能力
  為此我們需要編寫大量的單元測(cè)試的方法,可是這些測(cè)試方法都是大同小異的
  它們的代碼結(jié)構(gòu)都是相同的,不同的僅僅是測(cè)試數(shù)據(jù)和期望值
  這時(shí)可以使用JUnit4的參數(shù)化測(cè)試,提取測(cè)試方法中相同代碼 ,提高代碼重用度
  而JUnit3.8對(duì)于此類問(wèn)題,并沒(méi)有很好的解決方法,JUnit4.x彌補(bǔ)了JUnit3.8的不足
  參數(shù)化測(cè)試的要點(diǎn)
  ① 準(zhǔn)備使用參數(shù)化測(cè)試的測(cè)試類必須由org.junit.runners.Parameterized 運(yùn)行器修飾
 、 準(zhǔn)備數(shù)據(jù)。數(shù)據(jù)的準(zhǔn)備需要在一個(gè)方法中進(jìn)行,該方法需要滿足的要求如下
  1) 該方法必須由org.junit.runners.Parameterized.Parameters注解 修飾
  2) 該方法必須為返回值是java.util.Collection 類型的public  static方法
  3) 該方法沒(méi)有參數(shù) ,方法名可隨意 。并且該方法是在該類實(shí)例化之前執(zhí)行的
 、 為測(cè)試類聲明幾個(gè)變量 ,分別用于存放期望值和測(cè)試所用的數(shù)據(jù)
 、 為測(cè)試類聲明一個(gè)帶有參數(shù)的公共構(gòu)造函數(shù) ,并在其中為③ 中聲明的變量賦值
 、 編寫測(cè)試方法,使用定義的變量作為參數(shù)進(jìn)行測(cè)試
  參數(shù)化測(cè)試的缺點(diǎn)
  一般來(lái)說(shuō),在一個(gè)類里面只執(zhí)行一個(gè)測(cè)試方法。因?yàn)樗鶞?zhǔn)備的數(shù)據(jù)是無(wú)法共用的
  這要求,所要測(cè)試的方法是大數(shù)據(jù)量的方法,所以才有必要寫一個(gè)參數(shù)化測(cè)試
  而在實(shí)際開(kāi)發(fā)中,參數(shù)化測(cè)試用到的并不是特別多
  下面是JUnit4.x中參數(shù)化測(cè)試的示例代碼
  首先是Calculator.java
package com.jadyer.junit4;
/**
* 數(shù)學(xué)計(jì)算-->加法
*/
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
  然后是JUnit4.x的參數(shù)化測(cè)試類ParameterTest.java
package com.jadyer.junit4;
import static org.junit.Assert.assertEquals; //靜態(tài)導(dǎo)入
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.jadyer.junit4.Calculator;
/**
* JUnit4的參數(shù)化測(cè)試
*/
@RunWith(Parameterized.class)
public class ParameterTest {
private int expected;
private int input11;
private int input22;
public ParameterTest(int expected, int input11, int input22){
this.expected = expected;
this.input11 = input11;
this.input22 = input22;
}
@Parameters
public static Collection prepareData(){
//該二維數(shù)組的類型必須是Object類型的
//該二維數(shù)組中的數(shù)據(jù)是為測(cè)試Calculator中的add()方法而準(zhǔn)備的
//該二維數(shù)組中的每一個(gè)元素中的數(shù)據(jù)都對(duì)應(yīng)著構(gòu)造方法ParameterTest()中的參數(shù)的位置
//所以依據(jù)構(gòu)造方法的參數(shù)位置判斷,該二維數(shù)組中的第一個(gè)元素里面的第一個(gè)數(shù)據(jù)等于后兩個(gè)數(shù)據(jù)的和
//有關(guān)這種具體的使用規(guī)則,請(qǐng)參考JUnit4的API文檔中的org.junit.runners.Parameterized類的說(shuō)明
Object[][] object = {{3,1,2}, {0,0,0}, {-4,-1,-3}, {6,-3,9}};
return Arrays.asList(object);
}
@Test
public void testAdd(){
Calculator cal = new Calculator();
assertEquals(expected, cal.add(input11, input22));
}
}
/********************【該測(cè)試的執(zhí)行流程】************************************************************************/
//1..首先會(huì)執(zhí)行prepareData()方法,將準(zhǔn)備好的數(shù)據(jù)作為一個(gè)Collection返回
//2..接下來(lái)根據(jù)準(zhǔn)備好的數(shù)據(jù)調(diào)用構(gòu)造方法。Collection中有幾個(gè)元素,該構(gòu)造方法會(huì)被調(diào)用幾次
//   我們這里Collection中有4個(gè)元素,所以ParameterTest()構(gòu)造方法會(huì)被調(diào)用4次,于是會(huì)產(chǎn)生4個(gè)該測(cè)試類的對(duì)象
//   對(duì)于每一個(gè)測(cè)試類的對(duì)象,都會(huì)去執(zhí)行testAdd()方法
//   而Collection中的數(shù)據(jù)是由JUnit傳給ParameterTest(int expected, int input11, int input22)構(gòu)造方法的
//   于是testAdd()用到的三個(gè)私有參數(shù),被ParameterTest()構(gòu)造方法設(shè)置好值了,而它們?nèi)齻(gè)的值來(lái)自于Collection
/************************************************************************************************************/

上一頁(yè)12下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd