JUnit及其相關的單元測試技術

發表于:2015-09-21來源:uml.org.cn作者:不詳點擊數: 標簽:junit
在實際的工作中,很多項目都沒有寫單元測試用例。寫單元測試用例常常是程序員十分厭倦的一個項目活動,很多人覺得沒有必要、浪費時間。所有這些都是因為沒有認識到測試的重

  在實際的工作中,很多項目都沒有寫單元測試用例。寫單元測試用例常常是程序員十分厭倦的一個項目活動,很多人覺得沒有必要、浪費時間。所有這些都是因為沒有認識到測試的重要性:測試能夠使我們盡量早的發現程序的bug,一個bug被隱藏的時間越長,修復這個bug的代價就越大。在《快速軟件開發》一書中已引用了大量的研究數據指出:最后才修改一個bug的代價是在bug產生時修改它的代價的10倍。在現代軟件開發過程中,不管是xp還是rup 都是十分重視單元測試,已經把單元測試作為貫穿整個開發周期的一項重要的開發活動。單元測試如此重要,那么怎樣寫好單元測試用例呢?這就需要了解 Junit及其相關的測試工具了。

  1. Junit簡介:

  1.1 內容摘要

  Junit是由 Erich Gamma 和 Kent Beck 編寫的一個回歸測試框架(regression testing framework),供Java開發人員編寫單元測試之用。Junit測試是程序員測試,即所謂白盒測試。下面我們以一個簡單的例子來介紹如何使用 Junit4同Junit3編寫測試用例:

  先寫個簡單的被測試類:

  public Class XXXX{

  public String hello(){

  return "hello";

  }

  }

  對于這個類的用junit3編寫測試用例:

  import junit.framework.TestCase;

  public Class XXXXTest extends TestCase{

  public void testHello(){

  asssertEqual(new XXXX().Hello(),"hello");

  }

  }

  用junit4編寫測試用例:

  import static org.junit.framework.assertEqual;

  import org.junit.Test;

  public Class XXXXTest{

  @Test

  public void helloTest(){

  asssertEqual(new XXXX().Hello(),"hello");

  }

  }

  從上面例子我們對Junit3和Junit4有了一個初步的印象,下面我們重點介紹Junit4與Junit3的主要區別。

  1.2 Junit4與Junit3的主要區別

  1.2.1 Junit4引入了java 5.0的注釋技術:

  這兩個版本最大的區別在JUnit3.x中測試必須繼承 TestCase,并且每個方法名必須以test開頭。比如:testMethod1()而在JUnit4.x中不必繼承TestCase,采用了注解的方式。只要在測試的方法上加上注解@Test即可,從而不必再遵循以前的一些顯式約定和反射定位測試;在JUnit4.x中如果繼承了TestCase,注解就不起作用了。并且有很重要的一點就是在JUnit4.x中繼承了TestCase后,在OutLine視圖中測試單個方法時,結果整個類都run 了。還有一點就是,在3.x中需要實現setUp和tearDown方法,而在4.x中無需這樣,可以自定義需要在測試前和測試后的方法,在方法前加上 @before,@after就可以了。所以在JUnit4.x不必繼承TestCase用注解即可對單個方法進行測試。

  1.2.2 JUnit4引入了一個JUnit3中沒有的新特性——類范圍的 setUp() 和tearDown() 方法。

  任何用 @BeforeClass 注釋的方法都將在該類中的測試方法運行之前剛好運行一次,而任何用 @AfterClass 注釋的方法都將在該類中的所有測試都運行之后剛好運行一次。

  1.2.3 異常測試:

  異常測試是Junit4中的最大改進。Junit3的異常測試是在拋出異常的代碼中放入try塊,然后在try塊的末尾加入一個fail()語句。

  例如該方法測試一個被零除拋出一個ArithmeticException:

  該方法不僅難看,而且試圖挑戰代碼覆蓋工具,因為不管測試是否通過還是失敗,總有一些代碼不被執行。在JUni4中,可以編寫拋出異常的代碼,并使用注釋來聲明該異常是預期的:

  如果沒有異常拋出或者拋出一個不同的異常,那么測試就將失敗。

  1.2.4 JUnit4添加了兩個比較數組的assert() 方法:

  public static void assertEquals(Object[] expected, Object[] actual)

  public static void assertEquals(String message, Object[] expected, Object[] actual)

  這兩個方法以最直接的方式比較數組:如果數組長度相同,且每個對應的元素相同,則兩個數組相等,否則不相等。數組為空的情況也作了考慮。

  1.3 JUnit 4 常用的幾個annotation 介紹

  ★ @Before:初始化方法,在任何一個測試執行之前必須執行的代碼;

  ★ @After:釋放資源,在任何測試執行之后需要進行的收尾工作;

  ★ @Test:測試方法,表明這是一個測試方法。對于方法的聲明也有如下要求:名字可以隨便取,沒有任何限制,但是返回值必須為void,而且不能有任何參數。如果違反這些規定,會在運行時拋出一個異常。至于方法內該寫些什么,那就要看你需要測試些什么了;在這里可以測試期望異常和超時時間,如 @Test(timeout = 100),我們給測試函數設定一個執行時間,超過了這個時間(100毫秒),它們就會被系統強行終止,并且系統還會向你匯報該函數結束的原因是因為超時,這樣你就可以發現這些Bug了。

原文轉自:http://www.uml.org.cn/Test/201001217.asp

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97