這裡以一個加減乘除的類為例子。
最終工程如下:
1、導入junit的jar,不建議直接使用eclipse 中提供的包
junit的jar包下載:點擊打開鏈接 最新版本的是4.11
這裡注意一個問題:如果是用4.11版本的話,同時還要下載hamcrest 1.3,下載地址->點擊打開鏈接,使用時,要同時導入這兩個包才可以!!
如果是之前版本的,只需要導入一個junit的jar包就可以了
2、在src目錄下編寫服務代碼,這裡是一個只有加減乘除功能的類
[cpp] package com.fjnu.util;
public class Calculate {
public int add(int a, int b){
return a+b;
}
public int minus(int a, int b){
return a-b;
}
public int divide(int a,int b){
return a/b;
}
public int multi(int a, int b){
return a*b;
}
}
package com.fjnu.util;
public class Calculate {
public int add(int a, int b){
return a+b;
}
public int minus(int a, int b){
return a-b;
}
public int divide(int a,int b){
return a/b;
}
public int multi(int a, int b){
return a*b;
}
}
3、創建測試類
基本原則:1、在eclipse中創建一個source folder命名為test
2、創建一個測試類所在的包,包的名稱和要測試的類一致
[cpp] package com.fjnu.util;
import org.junit.Before;
import org.junit.Test;
// 靜態導入
import static org.junit.Assert.*;
public class TestCalculate {
private Calculate cal;
// 執行任意一個方法之前都會執行setUp方法
@Before
public void setUp(){
cal = new Calculate();
}
// 加了@Test表示該方法是一個單元測試
@Test
public void testAdd(){
/*
* 以下是一個簡單的斷言的編寫
* 第一個參數是如果出錯給出的提示信息
* 第二個表示期望值,通常是用戶指定的內容
* 第三個表示代碼返回的實際值
*/
// Assert.assertEquals("加法有問題", 34, cal.add(12,22));
/*
* 由於包進行了靜態導入之後
* Assert中的所有靜態方法就不用再添加類名了
* 這樣可以有效地兼容junit3
*/
assertEquals("加法有問題", 34, cal.add(12,22));
}
@Test
public void testMinus(){
int res = cal.minus(12, 2);
// Assert.assertEquals("減法有問題", 10, res);
assertEquals("減法有問題", 10, res);
}
// 表示這個測試類應該拋出ArithmeticException,如果不拋出就報錯
@Test(expected=ArithmeticException.class)
public void testDivide(){
int res = cal.divide(12, 0);
assertEquals("除法有問題", 6, res);
}
// 時間單位為ms
@Test(timeout=190)
public void testTime() throws InterruptedException{
Thread.sleep(209);
int rel = cal.divide(12, 2);
}
@Test
public void testMulti(){
int res = cal.multi(12, 2);
assertEquals("乘法有問題",24,res);
}
//hamcrest 1.3
}
package com.fjnu.util;
import org.junit.Before;
import org.junit.Test;
// 靜態導入
import static org.junit.Assert.*;
public class TestCalculate {
private Calculate cal;
// 執行任意一個方法之前都會執行setUp方法
@Before
public void setUp(){
cal = new Calculate();
}
// 加了@Test表示該方法是一個單元測試
@Test
public void testAdd(){
/*
* 以下是一個簡單的斷言的編寫
* 第一個參數是如果出錯給出的提示信息
* 第二個表示期望值,通常是用戶指定的內容
* 第三個表示代碼返回的實際值
*/
// Assert.assertEquals("加法有問題", 34, cal.add(12,22));
/*
* 由於包進行了靜態導入之後
* Assert中的所有靜態方法就不用再添加類名了
* 這樣可以有效地兼容junit3
*/
assertEquals("加法有問題", 34, cal.add(12,22));
}
@Test
public void testMinus(){
int res = cal.minus(12, 2);
// Assert.assertEquals("減法有問題", 10, res);
assertEquals("減法有問題", 10, res);
}
// 表示這個測試類應該拋出ArithmeticException,如果不拋出就報錯
@Test(expected=ArithmeticException.class)
public void testDivide(){
int res = cal.divide(12, 0);
assertEquals("除法有問題", 6, res);
}
// 時間單位為ms
@Test(timeout=190)
public void testTime() throws InterruptedException{
Thread.sleep(209);
int rel = cal.divide(12, 2);
}
@Test
public void testMulti(){
int res = cal.multi(12, 2);
assertEquals("乘法有問題",24,res);
}
//hamcrest 1.3
}
4、Junit3和Junit4兩者之間的區別是非常明顯的
在Junit3,中如果某個類需要是測試類,必須將其繼承於TestCase,如果某個方法需要是測試方法,必須讓這個方法通過testXXX開頭,在Junit3中如果希望指定某個測試方法運行之前運行某個初始化方法,這個方法名稱必須是setUp,如果希望在某個測試方法運行之後運行某個釋放資源的方法,這個方法的名稱必須是tearDown
在Junit4中,一個POJO類就是一個測試類,測試方法通過@Test來標識,初始化方法通過@Before,釋放資源的方法通過@After來標注。但是為了讓junit4中的測試類在junit3中也可以使用,習慣於把初始化方法命名為setUp,釋放資源的方法命名為tearDown,測試方法也同樣以test開頭
5、如何使用斷言
在junit4中提供了一個Assert的類,這個類中有大量的方法進行斷言的處理,在junit3中由於繼承了TestCase,這個TestCase中提供了大量的Assert方法。 在junit4中,為了與junit3兼容,可以靜態導入包Assert,即import static org.junit.Assert.*; 這樣的話使用Assert中的所有靜態方法就不用再添加類名了,可以有效地兼容junit3
6、expected參數,測試異常對象: @Test(expected=ArithmeticException.class),表示檢查是否拋出ArithmeticException
[java] // 表示這個測試類應該拋出ArithmeticException,如果不拋出就報錯
@Test(expected=ArithmeticException. class)
public void testDivide(){
int res = cal.divide(12, 2);
assertEquals( "除法有問題", 6, res);
// 表示這個測試類應該拋出ArithmeticException,如果不拋出就報錯
@Test(expected=ArithmeticException. class)
public void testDivide(){
int res = cal.divide(12, 2);
assertEquals( "除法有問題", 6, res);
}
7、timeout參數,性能測試:@Test(timeout=190),表示要在190ms內完成
[java] // 時間單位為ms
@Test(timeout=190)
public void testTime() throws InterruptedException{
Thread. sleep(189);
int rel = cal.divide(12, 2);
// 時間單位為ms
@Test(timeout=190)
public void testTime() throws InterruptedException{
Thread. sleep(189);
int rel = cal.divide(12, 2);
}