一、簡介
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不能與以前的版本相容。