1、Junit 是什么?
JUnit是一個Java語言的單元測試框架。它由Kent Beck和Erich Gamma建立,逐漸成為源於Kent Beck的sUnit的xUnit家族中最為成功的一個JUnit有它自己的JUnit擴展生態圈。多數Java的開發環境都已經集成了JUnit作為單元測試的工具。
注意:Junit 測試也是程序員測試,即所謂的白盒測試,它需要程序員知道被測試的代碼如何完成功能,以及完成什么樣的功能
2、Junit 能做什么?
我們知道 Junit 是一個單元測試框架,那么使用 Junit 能讓我們快速的完成單元測試。
通常我們寫完代碼想要測試這段代碼的正確性,那么必須新建一個類,然后創建一個 main() 方法,然后編寫測試代碼。如果需要測試的代碼很多呢?那么要么就會建很多main() 方法來測試,要么將其全部寫在一個 main() 方法里面。這也會大大的增加測試的復雜度,降低程序員的測試積極性。而 Junit 能很好的解決這個問題,簡化單元測試,寫一點測一點,在編寫以后的代碼中如果發現問題可以較快的追蹤到問題的原因,減小回歸錯誤的糾錯難度。
3、Junit 的用法
一、首先下載 Junit jar 包,這里給兩個版本的百度雲下載地址:
①、Junit 4.12版本 鏈接:http://pan.baidu.com/s/1c2cRqdM 密碼:hfix
②、Junit 4.8 版本 鏈接:http://pan.baidu.com/s/1qY8WVGK 密碼:ma2u
二、下載完成之后,在項目中將 下載的 jar 包放進去,然后右鍵,Build--->Add Build Path 即可。
如果你是用 eclipse 開發,也可以不用下載那些jar包,eclipse內部集成了,我們只需要引入即可:
①、選中項目,右鍵Build--->Add Library
②、彈出來的界面,選中 JUnit,點擊 next
③、選中 Junit 的版本,一般我們都用 4.0 以上的。點擊 Finish
三、我們先看下面這個例子,看一下 Junit 的用法
①、編寫代碼(需要測試的類)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public
class
Calculator {
/**
* 傳入兩個參數,求和
* @param a
* @param b
* @return
*/
public
int
add(
int
a,
int
b){
return
a+b;
}
/**
* 傳入兩個參數,求差
* @param a
* @param b
* @return
*/
public
int
sub(
int
a,
int
b){
return
a-b;
}
}
|
②、編寫測試類
一、不用Junit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
class
CalculatorTest {
public
static
void
main(String[] args) {
Calculator c =
new
Calculator();
//測試 add()方法
int
result = c.add(
1
,
2
);
if
(result ==
3
){
System.out.println(
"add()方法正確"
);
}
//測試 sub()方法
int
result2 = c.sub(
2
,
1
);
if
(result2 ==
1
){
System.out.println(
"sub()方法正確"
);
}
}
}
|
那么我們可以看到,不用 Junit 只能寫在 main()方法中,通過運行結果來判斷測試結果是否正確。這里需要測試的只有兩個方法,如果有很多方法,那么測試代碼就會變得很混亂。
二、使用 Junit(看不懂 Assert.assertEquals()方法沒關系,可以自己寫 if()語句來判斷)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
class
CalculatorTest {
@Test
//測試 add()方法
public
void
testAdd(){
Calculator c =
new
Calculator();
int
result = c.add(
1
,
2
);
Assert.assertEquals(result,
3
);
}
@Test
//測試 sub()方法
public
void
testSub(){
Calculator c =
new
Calculator();
int
result = c.sub(
2
,
1
);
Assert.assertEquals(result,
1
);
}
}
|
如何運行 Junit呢?鼠標放在需要測試的方法中,右鍵,Run As ---->JUnit Test
結果出現如下的綠色橫條,則測試通過,紅色橫條,則測試失敗
那么由上面可以看到,使用 Junit 不需要創建 main() 方法,而且每個測試方法一一對應,邏輯特別清晰。可能有讀者會問,這樣寫代碼量也並不會減少啊,那么你接着往下看:
首先介紹 Junit 的幾種類似於 @Test 的注解:
1.@Test: 測試方法
a)(expected=XXException.class)如果程序的異常和XXException.class一樣,則測試通過
b)(timeout=100)如果程序的執行能在100毫秒之內完成,則測試通過
2.@Ignore: 被忽略的測試方法:加上之后,暫時不運行此段代碼
3.@Before: 每一個測試方法之前運行
4.@After: 每一個測試方法之后運行
5.@BeforeClass: 方法必須必須要是靜態方法(static 聲明),所有測試開始之前運行,注意區分before,是所有測試方法
6.@AfterClass: 方法必須要是靜態方法(static 聲明),所有測試結束之后運行,注意區分 @After
那么上面的例子,我們可以看到,每個 @Test 方法中都有 Calculator c = new Calculator();即類的實例化,那么我們可以將其放入到 @Before 中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public
class
CalculatorTest {
Calculator c =
null
;
@Before
public
void
testBeforeClass(){
c =
new
Calculator();
}
@Test
//測試 add()方法
public
void
testAdd(){
int
result = c.add(
1
,
2
);
//Assert.assertEquals(result, 3);
//等價於:
if
(result ==
3
){
System.out.println(
"add()方法正確"
);
}
}
@Test
//測試 sub()方法
public
void
testSub(){
int
result = c.sub(
2
,
1
);
//Assert.assertEquals(result, 1);
//等價於:
if
(result ==
1
){
System.out.println(
"sub()方法正確"
);
}
}
}
|
同理:別的注解用法我們用一個類來看:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public
class
JunitTest {
public
JunitTest() {
System.out.println(
"構造函數"
);
}
@BeforeClass
public
static
void
beforeClass(){
System.out.println(
"@BeforeClass"
);
}
@Before
public
void
befor(){
System.out.println(
"@Before"
);
}
@Test
public
void
test(){
System.out.println(
"@Test"
);
}
@Ignore
public
void
ignore(){
System.out.println(
"@Ignore"
);
}
@After
public
void
after(){
System.out.println(
"@After"
);
}
@AfterClass
public
static
void
afterClass(){
System.out.println(
"@AfterClass"
);
}
}
|
結果為:
1
2
3
4
5
6
|
@BeforeClass
構造函數
@Before
@Test
@After
@AfterClass
|
注意:編寫測試類的原則:
①測試方法上必須使用@Test進行修飾
②測試方法必須使用public void 進行修飾,不能帶任何的參數
③新建一個源代碼目錄來存放我們的測試代碼,即將測試代碼和項目業務代碼分開
④測試類所在的包名應該和被測試類所在的包名保持一致
⑤測試單元中的每個方法必須可以獨立測試,測試方法間不能有任何的依賴
⑥測試類使用Test作為類名的后綴(不是必須)
⑦測試方法使用test作為方法名的前綴(不是必須)