天天看點

JUnit4 測試

JUnit4是JUnit架構有史以來的最大改進,其主要目标便是利用Java5的Annotation特性簡化測試用例的編寫。

先簡單解釋一下什麼是Annotation,這個單詞一般是翻譯成中繼資料。中繼資料是什麼?中繼資料就是描述資料的資料。也就是說,這個東西在Java裡面可以用來和public、static等關鍵字一樣來修飾類名、方法名、變量名。修飾的作用描述這個資料是做什麼用的,差不多和public描述這個資料是公有的一樣。想具體了解可以看Core    Java2。廢話不多說了,直接進入正題。

我們先看一下在JUnit 3中我們是怎樣寫一個單元測試的。比如下面一個類:

public class AddOperation {

      public int add(int x,int y){

          return x+y;

      }

}

我們要測試add這個方法,我們寫單元測試得這麼寫:

import junit.framework.TestCase;

import static org.junit.Assert.*;

public class AddOperationTest extends TestCase{

      public void setUp() throws Exception {

      public void tearDown() throws Exception {

      public void testAdd() {

          System.out.println(/"add/");

          int x = 0;

          int y = 0;

          AddOperation instance = new AddOperation();

          int expResult = 0;

          int result = instance.add(x, y);

          assertEquals(expResult, result);

可以看到上面的類使用了JDK5中的靜态導入,這個相對來說就很簡單,隻要在import關鍵字後面加上static關鍵字,就可以把後面的類的static的變量和方法導入到這個類中,調用的時候和調用自己的方法沒有任何差別。

我們可以看到上面那個單元測試有一些比較霸道的地方,表現在:

1.單元測試類必須繼承自TestCase。

2.要測試的方法必須以test開頭。

如果上面那個單元測試在JUnit 4中寫就不會這麼複雜。代碼如下:

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

/**

*

* @author bean

*/

      public AddOperationTest() {

      @Before

      @After

      @Test

      public void add() {

我們可以看到,采用Annotation的JUnit已經不會霸道的要求你必須繼承自TestCase了,而且測試方法也不必以test開頭了,隻要以@Test中繼資料來描述即可。

從上面的例子可以看到在JUnit 4中還引入了一些其他的中繼資料,下面一一介紹:

@Before:

使用了該中繼資料的方法在每個測試方法執行之前都要執行一次。

@After:

使用了該中繼資料的方法在每個測試方法執行之後要執行一次。

注意:@Before和@After标示的方法隻能各有一個。這個相當于取代了JUnit以前版本中的setUp和tearDown方法,當然你還可以繼續叫這個名字,不過JUnit不會霸道的要求你這麼做了。

@Test(expected=*.class)

在JUnit4.0之前,對錯誤的測試,我們隻能通過fail來産生一個錯誤,并在try塊裡面assertTrue(true)來測試。現在,通過@Test中繼資料中的expected屬性。expected屬性的值是一個異常的類型

@Test(timeout=xxx):

該中繼資料傳入了一個時間(毫秒)給測試方法,

如果測試方法在制定的時間之内沒有運作完,則測試也失敗。

@ignore:

該中繼資料标記的測試方法在測試中會被忽略。當測試的方法還沒有實作,或者測試的方法已經過時,或者在某種條件下才能測試該方法(比如需要一個資料庫聯接,而在本地測試的時候,資料庫并沒有連接配接),那麼使用該标簽來标示這個方法。同時,你可以為該标簽傳遞一個String的參數,來表明為什麼會忽略這個測試方法。比如:@lgnore(“該方法還沒有實作”),在執行的時候,僅會報告該方法沒有實作,而不會運作測試方法。

Ps:如果想了解Assert類中的方法,可以看我的這篇文章http://hi.baidu.com/beanchx/blog/item/2122e9c4bfad28a88326ac41.html