Junit核心——測試類(TestCase)、測試集(TestSuite)、測試執行器(TestRunner)
首先,把這三個定義簡單的說明一下:
1、測試類(TestCase):一個包含一個或是多個測試的類,在Junit中就是指的是包含那些帶有@Test註解的方法的類,同一樣也被稱作“測試用例”;
2、測試集(TestSuite):測試集是把多個相關測試歸入一個組的表達方式,在Junit中,如果我們沒有明確的定義一個測試集,那麼Juint會自動的提供一個測試集,一個測試集一般將同一個包的測試類歸入一組;
3、測試執行器(TestRunner):執行測試集的程式。
定義說完了,還有兩個好理解的定義:斷言(assert)和測試(Test),加上這兩個定義,從斷言到測試執行器就是從“原子”到“分子”的過程,“原子”組成“分子”的,“分子”包含若干”原子“。
關於測試類就比較好理解了,這裡就不再拿出來說了,具體的說一說測試集與測試執行器吧。
一、測試執行器:
本文開篇已經說了關於測試執行器的概念,比較簡單:執行測試集的程式,而在Junit中,我們使用測試執行器的方式也特別的簡單,主要的是使用Junit的@RunnWith註解
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(value=JUnit4.class)
public class TestRunner {
}
在此,我們定義了一個Junit4測試用例的執行器,Junit4包含下面4中測試執行器:
執行器 | 目的 |
org.junit.internal.runners.JUnit38ClassRunner | 為了向後相容Junit3.8的執行器 |
org.junit.runners.JUnit4 | Junit4的測試執行器 |
org.junit.runners.Parameterized | 可以使用不同引數來執行相同測試集的執行器 |
org.junit.runners.Suite | 包含不同測試的容器 |
其中,JUnit38ClassRunner是用來告知執行器將要執行的的測試應該是在Junit3.8中執行;Suite 我們會在測試集進行介紹,而Parameterized是我們要詳細介紹的
Parameterized(引數化)的測試執行器允許我們使用不同的引數多此運行同一個測試,
比如我們在測試一個提供乘法算數的方法時,我們可以為測試用例提供三組資料:4*5(兩個正整數)、-4*5(一正一負)、0*5(0與正整數),提供多組資料可以讓我們從不同的角度對同一個方法進行測試,
具體的實現如下:
package org.yezi.junit;
public class Calcaute {
public int ride(int a, int b){
return a * b;
}
}
package org.yezi.junit;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.junit.*;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(value=Parameterized.class)
public class TestCalcaute {
private Calcaute calcaute = null;
private int expected;
private int valueOne;
private int valueTwo;
@Parameters
public static Collection<Integer[]> getTestParameters(){
List<Integer[]> list = new ArrayList<Integer[]>();
list.add(new Integer[]{20,4,5}); //expected,valueOne,valueTwo
list.add(new Integer[]{-20,-4,5});
list.add(new Integer[]{0,0,5});
return list;
}
public TestCalcaute(int expected, int valueOne, int valueTwo){
this.expected = expected;
this.valueOne = valueOne;
this.valueTwo = valueTwo;
}
@Before
public void setUp(){
calcaute = new Calcaute();
}
@Test
public void testAdd(){
int result = calcaute.ride(valueOne, valueTwo);
assertEquals(expected, result);
}
}
ok,功能實現了,但是,在此我們要說明幾個必須:
1、實現引數化測試執行器,該類必須加上@RunWith(value=Parameterized.class)註解!否則執行Junit報java.lang.Exception: Test class should have exactly one public zero-argument constructor異常
2、必須把測試的期望結果、以及測試引數宣告為全域性的、私有的!
3、必須建立一個帶期望結果、測試引數的構造方法!
4、必須建立一個返回若干個測試引數、期望結果組的靜態方法,返回型別為Collection<Integer[]>,並且該方法加以@Parameters( org.junit.runners.Parameterized.Parameters)註解!
其實、我挺煩這麼多的必須,條條框框都約束了,哎,沒辦法啊
額,先寫這麼多吧,太長了不好看,那麼測試集就下一篇了!