junit測試是現在編寫測試代碼的手段之一,
本文簡要介紹如何快速搭建一個junit測試環境。
工具/原料
eclipse工具
junit包
方法/步驟
1
首先創建一個java Project;將junit包和hamcrest-core包導入到項目中
2
創建一個source folder 資源文件夾 test,資源文件夾和普通的文件夾區別是,資源文件夾中的java文件可以被自動編譯。
3
在java文件中編寫java代碼UserMananger.java,在test文件中創建一個與需要進行測試的java代碼同包名稱的TestUserManager.java文件。
4
junit4采用的是通過注解的方式(在方法的上面加上@)。
@Before表示在所有方法運行前運行的方法;
@After表示在所有的方法運行之后執行的方法;
@Test表示這是一個測試方法
@BeforeClass表示在這個測試類構造之前執行的方法
@AfterClass表示在這個測試類構造之后執行的方法
5
如果是對某一個方法進行測試,在方法的名稱上點擊右鍵 --》 run as --》 JUnit Test
6
如果是對所有的方法都執行一遍,在類體上右鍵--Run as--》 JunitTest 。
綠色的表示運行通過的方法,紅x的表示運行失敗的方法。
本文簡要介紹一下在Eclipse3.2中使用JUnit4進行單元測試的方法。
首先,我們來一個傻瓜式速成教程,不要問為什么,Follow Me,先來體驗一下單元測試的快感!
首先新建一個項目叫JUnit_Test,我們編寫一個Calculator類,這是一個能夠簡單實現加減乘除、平方、開方的計算器類,然后對這些功能進行單元測試。這個類并不是很完美,我們故意保留了一些Bug用于演示,這些Bug在注釋中都有說明。該類代碼如下:
package andycpp;
public class Calculator {
private static int result; // 靜態變量,用于存儲運行結果
public void add(int n) {
result = result + n;
}
public void substract(int n) {
result = result - 1; //Bug: 正確的應該是 result =result-n
}
public void multiply(int n) {
} // 此方法尚未寫好
public void divide(int n) {
result = result / n;
}
public void square(int n) {
result = n * n;
}
public void squareRoot(int n) {
for (; ;) ; //Bug : 死循環
}
public void clear() { // 將結果清零
result = 0;
}
public int getResult() {
return result;
}
}
第二步,將JUnit4單元測試包引入這個項目:在該項目上點右鍵,點“屬性”,如圖:
在彈出的屬性窗口中,首先在左邊選擇“Java Build Path”,然后到右上選擇“Libraries”標簽,之后在最右邊點擊“Add Library…”按鈕,如下圖所示:
然后在新彈出的對話框中選擇JUnit4并點擊確定,如上圖所示,JUnit4軟件包就被包含進我們這個項目了。
第三步,生成JUnit測試框架:在Eclipse的Package Explorer中用右鍵點擊該類彈出菜單,選擇“New à JUnit Test Case”。如下圖所示:
在彈出的對話框中,進行相應的選擇,如下圖所示:
點擊“下一步”后,系統會自動列出你這個類中包含的方法,選擇你要進行測試的方法。此例中,我們僅對“加、減、乘、除”四個方法進行測試。如下圖所示:
之后系統會自動生成一個新類CalculatorTest,里面包含一些空的測試用例。你只需要將這些測試用例稍作修改即可使用。完整的CalculatorTest代碼如下:
package andycpp;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
@Before
public void setUp() throws Exception {
calculator.clear();
}
@Test
public void testAdd() {
calculator.add(2);
calculator.add(3);
assertEquals(5, calculator.getResult());
}
@Test
public void testSubstract() {
calculator.add(10);
calculator.substract(2);
assertEquals(8, calculator.getResult());
}
@Ignore(“Multiply() Not yet implemented”)
@Test
public void testMultiply() {
}
@Test
public void testDivide() {
calculator.add(8);
calculator.divide(2);
assertEquals(4, calculator.getResult());
}
}
第四步,運行測試代碼:按照上述代碼修改完畢后,我們在CalculatorTest類上點右鍵,選擇“Run As à JUnit Test”來運行我們的測試,如下圖所示:
運行結果如下:
進度條是紅顏色表示發現錯誤,具體的測試結果在進度條上面有表示“共進行了4個測試,其中1個測試被忽略,一個測試失敗”。
我們繼續對初級篇中的例子進行分析。初級篇中我們使用Eclipse自動生成了一個測試框架,在這篇文章中,我們來仔細分析一下這個測試框架中的每一個細節,知其然更要知其所以然,才能更加熟練地應用JUnit4。
一、 包含必要地Package
在測試類中用到了JUnit4框架,自然要把相應地Package包含進來。最主要地一個Package就是org.junit.*。把它包含進來之后,絕大部分功能就有了。還有一句話也非常地重要“import static org.junit.Assert.*;”,我們在測試的時候使用的一系列assertEquals方法就來自這個包。大家注意一下,這是一個靜態包含(static),是JDK5中新增添的一個功能。也就是說,assertEquals是Assert類中的一系列的靜態方法,一般的使用方式是Assert. assertEquals(),但是使用了靜態包含后,前面的類名就可以省略了,使用起來更加的方便。
二、 測試類的聲明
大家注意到,我們的測試類是一個獨立的類,沒有任何父類。測試類的名字也可以任意命名,沒有任何局限性。所以我們不能通過類的聲明來判斷它是不是一個測試類,它與普通類的區別在于它內部的方法的聲明,我們接著會講到。
三、 創建一個待測試的對象。
你要測試哪個類,那么你首先就要創建一個該類的對象。正如上一篇文章中的代碼:
private static Calculator calculator = new Calculator();
為了測試Calculator類,我們必須創建一個calculator對象。
四、 測試方法的聲明
在測試類中,并不是每一個方法都是用于測試的,你必須使用“標注”來明確表明哪些是測試方法。“標注”也是JDK5的一個新特性,用在此處非常恰當。我們可以看到,在某些方法的前有@Before、@Test、@Ignore等字樣,這些就是標注,以一個“@”作為開頭。這些標注都是JUnit4自定義的,熟練掌握這些標注的含義非常重要。
五、 編寫一個簡單的測試方法。
首先,你要在方法的前面使用@Test標注,以表明這是一個測試方法。對于方法的聲明也有如下要求:名字可以隨便取,沒有任何限制,但是返回值必須為void,而且不能有任何參數。如果違反這些規定,會在運行時拋出一個異常。至于方法內該寫些什么,那就要看你需要測試些什么了。比如:
@Test
public void testAdd() {
calculator.add(2);
calculator.add(3);
assertEquals(5, calculator.getResult());
}
我們想測試一下“加法”功能時候正確,就在測試方法中調用幾次add函數,初始值為0,先加2,再加3,我們期待的結果應該是5。如果最終實際結果也是5,則說明add方法是正確的,反之說明它是錯的。assertEquals(5, calculator.getResult());就是來判斷期待結果和實際結果是否相等,第一個參數填寫期待結果,第二個參數填寫實際結果,也就是通過計算得到的結果。這樣寫好之后,JUnit會自動進行測試并把測試結果反饋給用戶。
六、 忽略測試某些尚未完成的方法。
如果你在寫程序前做了很好的規劃,那么哪些方法是什么功能都應該實現定下來。因此,即使該方法尚未完成,他的具體功能也是確定的,這也就意味著你可以為他編寫測試用例。但是,如果你已經把該方法的測試用例寫完,但該方法尚未完成,那么測試的時候一定是“失敗”。這種失敗和真正的失敗是有區別的,因此JUnit提供了一種方法來區別他們,那就是在這種測試函數的前面加上@Ignore標注,這個標注的含義就是“某些方法尚未完成,暫不參與此次測試”。這樣的話測試結果就會提示你有幾個測試被忽略,而不是失敗。一旦你完成了相應函數,只需要把@Ignore標注刪去,就可以進行正常的測試。
七、 Fixture(暫且翻譯為“固定代碼段”)
Fixture的含義就是“在某些階段必然被調用的代碼”。比如我們上面的測試,由于只聲明了一個Calculator對象,他的初始值是0,但是測試完加法操作后,他的值就不是0了;接下來測試減法操作,就必然要考慮上次加法操作的結果。這絕對是一個很糟糕的設計!我們非常希望每一個測試都是獨立的,相互之間沒有任何耦合度。因此,我們就很有必要在執行每一個測試之前,對Calculator對象進行一個“復原”操作,以消除其他測試造成的影響。因此,“在任何一個測試執行之前必須執行的代碼”就是一個Fixture,我們用@Before來標注它,如前面例子所示:
@Before
public void setUp() throws Exception {
calculator.clear();
}
這里不在需要@Test標注,因為這不是一個test,而是一個Fixture。同理,如果“在任何測試執行之后需要進行的收尾工作”也是一個Fixture,使用@After來標注。由于本例比較簡單,沒有用到此功能。
JUnit4的一些基本知識就介紹到此,還有一些更靈活的用法放在本系列的高級篇中給大家介紹!
評論