1. 程式人生 > >Junit核心——測試類(TestCase)、測試集(TestSuite)、測試執行器(TestRunner)

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)註解!

其實、我挺煩這麼多的必須,條條框框都約束了,哎,沒辦法啊

額,先寫這麼多吧,太長了不好看,那麼測試集就下一篇了!