Junit 概念,原理這里就不說了,有興趣的朋友可以查閱相關資料,這篇文章主要是為了快速給大家介紹一下junit4的使用
以及與 junit3的區別,這里默認大家對junit3已經有些理解了。下面就開始吧:
1.先寫個簡單的被測試類:
package test.junit;
public class
BaseClass {
public String method() {
return this.getClass().getName();
}
}
2.對于這個類的unit測試,我們先看看在junit3中怎么進行測試的吧:
package test.junit;
import junit.framework.TestCase;//引入TestCase類
public class
BaseClassTest extends TestCase {//類必須繼承TestCase
BaseClass baseClass;
protected void
setUp() throws Exception {
super.setUp();
baseClass = new BaseClass();
}
public void
testMethod (){//測試方法必須以test開頭
//通過assert*來檢驗
assertTrue(baseClass.method
().equals("test.junit.BaseClass"));
}
}
通過上面這個類,我們對junit3進行一些總結:
1. 必須引入類TestCase(import junit.framework.TestCase;),
2. 必須繼承類TestCase (class BaseClassTest extends TestCase)
3. 測試方法必須以test開頭(public void testMethod ())
4. 通過assert*方法來判斷結果(assertTrue(baseClass.method ().equals("test.junit.BaseClass"));)。
3. 下面來了解一下junit4里面的內部關系吧,下面來看看我們今天的主角junit4是怎么處理這些的吧:
package test.junit;
import org.junit.Test;//引入Test類
import static
org.junit.Assert.*;//引入Assert.*包
public class
BaseClassTestNew {//這里不用再繼承TestCase類了。
BaseClass baseClass = new BaseClass();
@Test public void methodOne(){//名字可以按你自己的愛好。但是必須以@Test開頭
//還是以assert*來判斷
assertTrue(baseClass.methodOne().equals("test.junit.BaseClass"));
}
}
看看多么的簡潔,好像少了很多約束,下面通過和junit3的特性進行比較總結junit4的特性:
1.必須引入類TestCase(import junit.framework.TestCase;
è必須引入類Test(import org.junit.Test;),必須引入類(import static org.junit.Assert.*;)
2.必須繼承類TestCase (class BaseClassTest extends TestCase)
è不需要
3.測試方法必須以test開頭(public void testMethod ())
è不需要,但是類開始的時候要標記 @Test
4.通過assert*方法來判斷結果(assertTrue(baseClass.method ).equals("test.junit.BaseClass"));)。
從上面的對比,可以看出junit4與junit3的區別在于:
去掉與類TestCase的偶聯性,唯一觸發TestCase的地方就是在@Test上。
4.以上就是junit4與junit3的區別與改進,下面再繼續看看junit4有哪些新增加的功能吧:
1. @Before 和 @After
類似于init() 和destory(),可以將一些初始化和釋放工作放到這里面,每個類都只有一個@Before 和 @After。為了實現這個功能,我們將測試類修改如下:
import org.junit.Test;
//新增加兩個類
import org.junit.Before;
import org.junit.After;
import static
org.junit.Assert.*;
public class
BaseClassTestNew {
BaseClass baseClass ; //這里不用進行初始化
@Before public void
runBeforeTest(){
baseClass = new BaseClass();
}
@Test public void method (){
assertTrue(baseClass.method
().equals("test.junit.BaseClass"));
}
@After public void
runAfterTest(){
baseClass.teardownList();
baseClass = null;
}
}
@Before 方法會在 @Test 之前進行,相反 @After 會在所有方法運行完進行。
Junit4同時還支持 @BeforeClass 和 @AfterClass,原理一樣,大家可以參考相關資料。
2.TimeOut 屬性
Junit4支持timeout,運用如下:
a. 首先在被測試類中增加用于測試timeout的方法:
public void
methodTimeOut() {
try {
Thread.sleep(50);//睡50秒
System.out.println("methodTimeOut");
} catch (InterruptedException e) {
}
}
b.看看怎么測試這個方法:
@Test(timeout=5)
public void
methodTimeOut(){
baseClass.methodTimeOut();
}
1. 增加(timeout=5)這個設置項
2. 運行完 沒有輸出methodTimeOut,說明這個方法沒有執行完,達到效果。
junit中的assert方法全部放在Assert類中,總結一下junit類中assert方法的分類。
1.assertTrue/False([String message,]boolean condition);
判斷一個條件是true還是false。感覺這個最好用了,不用記下來那么多的方法名。
2.fail([String message,]);
失敗,可以有消息,也可以沒有消息。
3.assertEquals([String message,]Object expected,Object actual);
判斷是否相等,可以指定輸出錯誤信息。
第一個參數是期望值,第二個參數是實際的值。
這個方法對各個變量有多種實現。在JDK1.5中基本一樣。
但是需要主意的是float和double最后面多一個delta的值,可能是誤差范圍,不確定這個
4.assertNotNull/Null([String message,]Object obj);
判讀一個對象是否非空(非空)。
5.assertSame/NotSame([String message,]Object expected,Object actual);
判斷兩個對象是否指向同一個對象。看內存地址。
7.failNotSame/failNotEquals(String message, Object expected, Object actual)
當不指向同一個內存地址或者不相等的時候,輸出錯誤信息。
注意信息是必須的,而且這個輸出是格式化過的。