JUnit的annotation

前面已經寫過一個例子了,但是那個例子只是入門,本例主要說說JUnit中用到的annotation,其實在上例中已經使用過了,那就是測試方法時用到的@Test。上例中講到了JUnit測試的書寫規範,包括包名(原包名.test),類名(原類名Test),其實還有方法名(test原方法名),這一點在上例中沒講到,因爲上例使用的是eclipse自動創建Test Case,這是需要注意的。另外需要說明的一點是本例和上例使用的都是JUnit4。

1.普通方法使用的annotation爲@Test,他有2個可選參數,形式爲@Test(expected=xx,timeout=yy),其中xx表示Class<? extends Throwable> org.junit.Test.expected(),相當於拋出異常,對發生異常的方法使用此參數則測試能夠通過;yy表示long org.junit.Test.timeout(),表示超時的毫秒數,用到測試方法的執行時間。實例如下:

待測試的JUnit類

package com.baosight.junit;

/**
 * 
* <p>Title:JUnit </p>
* <p>Description:TODO </p>
* <p>Company: </p> 
* @author yuan 
* @date 2016-4-12 下午9:49:19
 */
public class JUnit {
/**
 * 求和
 * @Title: add 
 * @Description: TODO
 * @param x
 * @param y
 * @return 
 * @return int  
 * @author yuan
 * @date 2016-4-12下午9:49:39
 */
public int add(int x,int y){
	return x+y;
}
/**
 * 除法
 * @Title: divide 
 * @Description: TODO
 * @param x
 * @param y
 * @return 
 * @return int  
 * @author yuan
 * @date 2016-4-13下午8:52:49
 */
public int divide(int x,int y){
	return x/y;
}
}
測試類JUnitTest

package com.baosight.junit.test;

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

import org.junit.Ignore;
import org.junit.Test;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.After;
import org.junit.AfterClass;

import com.baosight.junit.JUnit;

/**
 * <p>Title:IUnitTest </p>
 * <p>Description:TODO </p>
 * <p>Company: </p> 
 * @author yuan 
 * @date 2016-4-12 下午9:51:22*/
public class IUnitTest {
	/**
	 * 在所有方法之前執行
	 * @Title: beforeClass 
	 * @Description: TODO 
	 * @return void  
	 * @author yuan
	 * @date 2016-4-13下午9:36:13
	 */
	@BeforeClass
	public static void beforeClass(){
		System.out.println("BeforeClass");
	}
	/**
	 * 在所有方法之後執行
	 * @Title: afterClass 
	 * @Description: TODO 
	 * @return void  
	 * @author yuan
	 * @date 2016-4-13下午9:36:45
	 */
	@AfterClass
	public static void afterClass(){
		System.out.println("AfterClass");
	}
	/**
	 * 在每個方法執行之前執行
	 * @Title: before 
	 * @Description: TODO 
	 * @return void  
	 * @author yuan
	 * @date 2016-4-13下午9:37:02
	 */
	@Before
	public void before(){
		System.out.println("Before");
	}
	/**
	 * 在每個方法執行之後執行
	 * @Title: after 
	 * @Description: TODO 
	 * @return void  
	 * @author yuan
	 * @date 2016-4-13下午9:37:42
	 */
	@After
	public void after(){
		System.out.println("After");
	}
	/**
	 * 測試
	 * @Title: testAdd 
	 * @Description: TODO 
	 * @return void  
	 * @author yuan
	 * @date 2016-4-12下午9:52:19
	 */
	@Ignore//此方法被忽略,不執行
	@Test
	public void testAdd() {
		int z = new JUnit().add(3, 5);
		assertEquals(8, z);//成功
		assertThat(z, is(8));//成
		assertThat(z, allOf(greaterThan(3),lessThan(9)));//成功
		assertThat(z, anyOf(greaterThan(8),lessThan(9)));//失敗
	}
	/**
	 * 測試
	 * @Title: testDivide 
	 * @Description: TODO 
	 * @return void  
	 * @author yuan
	 * @date 2016-4-13下午8:54:06
	 */
	
	@Test(expected=java.lang.ArithmeticException.class,timeout=1)
	public void testDivide() {
		int z = new JUnit().divide(8, 0);
		assertEquals(4, z);//成功
		assertThat(z, is(4));//成
		assertThat(z, allOf(greaterThan(3),lessThan(9)));//成功
		assertThat(z, anyOf(greaterThan(8),lessThan(8)));//失敗
	}
}
執行效果如下:




2.關於@Ignore的使用,表示忽略該方法的執行,比如本例中testAdd方法就使用了@Ignore,從運行結果可以看西湖其未執行。該annotation的現實意義在於對於那些沒有實現的方法進行標註不予測試,方便模塊化管理。

3.關於@Before和@After的使用,他們在每個測試方法的執行之前和執行之後都會各自執行一次。本例中共有2個測試方法,由於使用@Ignore忽略了一個,所以@Before和@After各執行1次,如果執行了2個測試方法,則@Before和@After各執行2次。

4.關於@BeforeClass和@AfterClass的使用,此2方法分別在所有方法執行之前和所有方法執行之後分別執行1次。使用它們的現實意義在於,對於測試一些比較複雜的方法時做一些預處理,比如資源的加載和釋放,比如jdbc連接數據庫的相關配置就可以使用@BeforeClass和@AfterClass進行預處理,從而優化執行流程,提高測試的效率。值得注意的是二者都是靜態方法,即static。

以上即爲JUnit常用的annotation,需要根據實際情況進行靈活地選用。



發佈了50 篇原創文章 · 獲贊 46 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章