天天看點

Junit4的使用方法

一、簡介

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

在Eclipse 3.2中已經自帶了Junit 4.1(我使用的開發環境是Eclipse 3.3+Myeclipse 6.0),我們可以将Junit 4 Library添加到項目用到的Library中。也可以到Junit.org去下載下傳Junit 4 Librar。要求:JDK 5.0或以上版本。

二、使用

1、Junit 3中,Junit依賴反射來執行每個以test開頭的方法,但是Junit 4中,有了Annotation的,我們的測試方法就不需要再以testXXX來辨別了,而是寫上一個@Test标注即可。如:

@Test public static void m1() {}

2、測試類也不必繼承自TestCase了。我們可能會想到,不繼承TestCase,我們就無法使用斷言,即無法調用assertXxx()方法了。所 以,在Junit 4中,所有的斷言的方法全部都以靜态方法的形式放入到了Assert類中,使用Assert.assertXxx()來調用,如果使用import static靜态導入Assert,那麼與Junit 3中使用斷言是一樣的。

3、Junit 3中,setUp()和tearDown()方法分别是準備測試環境和釋放資源,在Junit 4中,這二個方法依賴于@Before和@After标記,好處是如果我們忘記了在這二個方法中調用父類的同名方法,Junit架構會自動處理使用 @Before和@After标記的方法。

4、不再強迫必須使用setUp()和tearDown()作為方法名,可以使用更有意義的方法名。如:init()和close(),前提是它們被标注了@Before和@After标記

三、執行個體開發

我們還使用講解Junit 3時使用的Calculate類

package junit;

public class Calculate {

public int add(int a, int b) {

return a + b;

}

public int minus(int a,int b)

{

return a - b;

}

}

Junit 4測試類

public class CalculateTest {

private Calculate cal ;

public CalculateTest()

{

System.out.println("建立了CalculateTest類的執行個體");

}

@Before

public void init() throws Exception {

cal = new Calculate();

System.out.println("測試方法前調用@Befored");

}

@After

public void close() throws Exception {

System.out.println("測試方法後調用@After");

}

@Test

public void doAdd() {

assertEquals(cal.add(1, 2), 3);

}

@Test

public void testMinus() {

assertEquals(cal.minus(2, 1), 1);

}

}

四、測試異常:

對測試異常,JUnit 4可以用expected=Exception.class來期待一個預期的異常,而不必手動編寫。如:測試以下方法,

public int div(int a,int b)

{

return a / b;

}

可能會抛出除數為0的異常,我們可以這樣來編寫:

@Test(expected=ArithmeticException.class)

public void testDiv() {

cal.div(5, 0);

}

五、設定最長執行時間

對于非常耗時的測試,@Test還有一個timeout來辨別該方法最長執行時間,超過此時間即表示該方法測試失敗:1為毫秒數

@Test(timeout=1)

public void testMinus() {

assertEquals(cal.minus(2, 1), 1);

}

六、@BeforeClass和@AfterClass

這是Junit 4與Junit 3相比較另一個較大的差別。它們在一個Test類的所有測試方法執行前後各執行一次。這是為了初始化一些重要的資源,比如資料庫連接配接,會在 @BeforeClass中來執行初始化,然後再執行測試方法,最後在@AfterClass中釋放資源。

由于這二個方法在運作其間僅執行一次,是以它們隻能标記為靜态方法,其實在所有的測試方法中共享的資源也必須是靜态引用。如:

@BeforeClass

public static void setUpBeforeClass() throws Exception {

System.out.println("call @BeforeClass and init database connection");

dbConnection = new Object();

}

@AfterClass

public static void tearDownAfterClass() throws Exception {

System.out.println("call @AfterClass to release database connection");

dbConnection = null;

}

注意:

Java 5.0中的自動Box/UnBox特性,在調用assertEquals()時要注意:如果我們這樣寫:

assertEquals(100f,100);

按照自動裝箱會變成:

assertEquals(new Float(100f),new Integer(100));

這樣會引起測試失敗,因為它們類型不一樣。

是以我們對float和double的測試,應試使用:

assertEquals(float, float, float delta);

assertEquals(double, double, double delta);

還有一點,Junit 4不能與以前的版本相容。

繼續閱讀