在Eclipse中使用JUnit進行 單元測試

在Eclipse中使用JUnit進行

單元測試

 

 

目錄

1.JUnit簡介... 2

2.JUnit優點... 2

3.JUnit特性... 3

4.JUnit運用... 3

5.JUnit重要元素... 17

 

 

 

 

 

 

 

 

1.JUnit簡介

JUnit是一個Java語言的單元測試框架。它由Kent Beck和Erich Gamma建立,逐漸成爲源於Kent Beck的sUnit的xUnit家族中最爲成功的一個。 JUnit有它自己的JUnit擴展生態圈。多數Java的開發環境都已經集成了JUnit作爲單元測試的工具。   

JUnit是由 Erich Gamma 和Kent Beck 編寫的一個迴歸測試框架(regression testing framework)。Junit測試是程序員測試,即所謂白盒測試,因爲程序員知道被測試的軟件如何(How)完成功能和完成什麼樣(What)的功能。Junit是一套框架,繼承TestCase類,就可以用Junit進行自動測試了。

 

2.JUnit優點

junit是在極限編程和重構(refactor)中被極力推薦使用的工具,因爲在實現自動單元測試的情況下可以大大的提高開發的效率,但是實際上編寫測試代碼也是需要耗費很多的時間和精力的,那麼使用這個東東好處到底在哪裏呢?筆者認爲是這樣的:

極限編程

要求在編寫代碼之前先寫測試,這樣可以強制你在寫代碼之前好好的思考代碼(方法)的功能和邏輯,否則編寫的代碼很不穩定,那麼你需要同時維護測試代碼和實際代碼,這個工作量就會大大增加。因此在極限編程中,基本過程是這樣的:構思-> 編寫測試代碼-> 編寫代碼-> 測試,而且編寫測試和編寫代碼都是增量式的,寫一點測一點,在編寫以後的代碼中如果發現問題可以較快的追蹤到問題的原因,減小回歸錯誤的糾錯難度。

重構

其好處和極限編程中是類似的,因爲重構也是要求改一點測一點,減少迴歸錯誤造成的時間消耗。

其他情況

我們在開發的時候使用junit寫一些適當的測試也是有必要的,因爲一般我們也是需要編寫測試的代碼的,可能原來不是使用的junit,如果使用junit,而且針對接口(方法)編寫測試代碼會減少以後的維護工作,例如以後對方法內部的修改(這個就是相當於重構的工作了)。另外就是因爲junit有斷言功能,如果測試結果不通過會告訴我們哪個測試不通過,爲什麼,而如果是像以前的一般做法是寫一些測試代碼看其輸出結果,然後再由自己來判斷結果是否正確,使用junit的好處就是這個結果是否正確的判斷是它來完成的,我們只需要看看它告訴我們結果是否正確就可以了,在一般情況下會大大提高效率。

 

 

3.JUnit特性

JUnit是一個開放源代碼的Java測試框架,用於編寫和運行可重複的測試。他是用於單元測試框架體系xUnit的一個實例(用於java語言)。它包括以下特性:

1、用於測試期望結果的斷言(Assertion

2、用於共享共同測試數據的測試工具

3、用於方便的組織和運行測試的測試套件

4、圖形和文本的測試運行器

 

 

4.JUnit運用

第一步:下載JUnit的jar包,下載地址:https://github.com/junit-team/junit/releases/download/r4.12/junit-4.12.jar;

 

第二步:安裝Eclipse安裝程序,已經安裝好!

 

第三步:利用junit在eclipse中開發自動化腳本;

JUnit可以和很多開發工具進行集成來進行單元測試,我們這裏選取較常用的java開發工具Eclipse來使用JUnit4進行單元測試。如何在開發工具Eclipse裏 進行單元測試

 

第四步:首先啓動Eclipse,並在Eclipse中建立一個java項目,項目名稱爲JNuit_test1。如下圖所示:

單擊【完成】即可;

 

 

 

第五步:在建立好的項目名稱(JNuit_test)上右鍵單擊【屬性】,系統彈出如下圖所示:

第六步:選擇java構建路徑→庫→我們這裏選擇前面下載的junit-4.12.jar包,故單擊【添加外部JAR(X)】按鈕,系統彈出如下對話框,選擇junit-4.12.jar包後,單擊【打開】鍵,如下圖所示:

 

第七步:在建立好的項目名稱(JNuittest)上右鍵單擊【新建】→【包】,取包名稱爲andycpp,系統彈出如下圖所示:

第八步:在建立好的類名稱【andycpp】上右鍵單擊【新建】→類,取名稱爲【Calculator】,如下圖所示:

第九步:我們在此編寫一個類,這是一個能夠簡單實現加減乘除、平方、開方的計算器類,然後對這些功能進行單元測試。這個類並不是很完美,我們故意保留了一些Bug用於演示,這些Bug在註釋中都有說明。該類代碼如下:

package andycpp;

 

publicclass Calculator {

    privatestaticintresult; // 靜態變量,用於存儲運行結果

 

     publicvoid add(int n)  {

      result = result + n;

     }

 

     publicvoid substract(int n)

     {

      result = result - 1;  //Bug: 正確的應該是 result =result-n

     }

 

     publicvoid multiply(int n)

     {

 

     }         // 此方法尚未寫好

 

     publicvoid divide(int n)

     {

 

      result = result / n;

 

     }

 

     publicvoid square(int n)

     {

 

      result = n * n;

 

     }

 

     publicvoid squareRoot(int n)

     {

 

      for (; ; ) ;            //Bug : 死循環

 

     }

 

     publicvoid clear()

     {     // 將結果清零

 

      result = 0;

 

     }

 

     publicint getResult()

     {

 

      returnresult;

 

     }

 

}

 

第十步:生成JUnit測試框架,選中已經編好的類,單擊右鍵【新建】→JUnit測試用例,如下圖所示:

單擊【下一步】顯示測試方法,下面我們只選擇四項,如下圖所示:

單擊【完成】鍵,系統創建了一個測試類,類名稱爲CalculatorTest.java;代碼如下:

第十一步:對上面測試類代碼進行完善,代碼如下圖所示:

package andycpp;

 

import junit.framework.TestCase;

 

import org.junit.Before;

import org.junit.Test;

 

publicclass CalculatorTest extends TestCase{

  

 privatestatic Calculator calculator = new Calculator();

 

     @Before

     publicvoid setUp() throws Exception

     {

      calculator.clear();

     }

 

     

     publicvoid testAdd()   {

      calculator.add(2);

 

      calculator.add(3);

 

      assertEquals(5, calculator.getResult());

 

     }

   

     @Test

     publicvoid testSubstract()

     {

      calculator.add(10);

 

      calculator.substract(8);

      System.out.println(calculator.getResult());

      assertEquals(9, calculator.getResult());

 

     }

 

    @Test

     publicvoid testMultiply() {

         System.out.println("");

    }

 

    @Test

    publicvoid testDivide()

     {

      calculator.add(8);

 

      calculator.divide(2);

     

     

      assertEquals(4, calculator.getResult());

     

     

     }

 

}

第十二步:對上面的測試類進行完善後,右鍵單擊【CalculatorTest.java】→【運行方式】→【JUnit測試】,測試結果如下:

第十三步:爲了查詢這兩個錯誤,可以雙擊對應錯誤結果,在右側對應方法有顯示,如下圖所示:

上面的期望結果,若改爲【5】,測試加的結果通過,如下圖所示:

接着我們看看第二個錯誤的原因,重新運行測試,如下圖所示:

通過上圖分析,是程序邏輯存在錯誤,故查看Calculator.java類,發現Substract的邏輯爲如下圖所示:

修改程序的邏輯表達式爲result=result-n,再次執行測試用例,如下圖所示:

以上是一個簡單的加減乘除運算的邏輯程序,通過這個程序演示了JUnit測試框架在Eclipse中的運用。

 

 

5.JUnit重要元素

A、@TEST

方法的前面使用@Test標註,以表明這是一個測試方法。對於方法的聲明也有如下要求:名字可以隨便取,沒有任何限制,但是返回值必須爲void,而且不能有任何參數。

 

@Test

   publicvoid testAdd() {

      

         calculator.add(2);

         calculator.add(3);

        

         System.out.println(calculator.getResult());

         assertEquals(5, calculator.getResult());

   }

 

 

B、@Before

註解:在每個測試方法之前執行;

 

C、@After

註解:在每個測試方法之後執行;

 

D、@BeforeClass

註解:在所有方法執行之前執行;

 

E、@AfterClass

註解:在所有方法執行之後執行;

 

F、@Test(timeout = xxx)

註解:設置當前測試方法在一定時間內運行完,否則返回錯誤;

 

G、@Test(expected = Exception.class)

註解:設置被測試的方法是否有異常拋出。拋出異常類型爲:Exception.class

 

H、@Ignore

註解:註釋掉一個測試方法或一個類,被註釋的方法或類,不會被執行。

 

 

 

參考資料:

http://www.blogjava.net/jnbzwm/archive/2010/12/15/340801.html

http://blog.csdn.net/wangpeng047/article/details/9627527

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章