Junit基本教程

 

內容摘要:

在要使用JUNIT的project名上,點擊properties--java build path-libraries, 點擊Add External JARs,把JUNIT包點上就行了. 並在需要測試的項目上新建junit test case

 

  junit是java中書寫unit test的framework,目前一些流行的unit test工具大都都是在junit上擴展而來的。

  Eclipse中配置junit

  在要使用JUNIT的project名上,點擊properties--java build path-libraries, 點擊Add External JARs,把JUNIT包點上就行了. 並在需要測試的

  用法

  1. 基本使用步驟,Junit的使用非常簡單,它的基本使用步驟:

  - 創建,從junit.framework.TestCase派生unit test需要的test case

  - 書寫測試方法,提供類似於如下函數簽名的測試方法:

  public void testXXXXX();

  - 編譯,書寫完test case後,編譯所寫的test case類

  - 運行,啓動junit test runner,來運行這個test case。

  Junit提供了2個基本的test runner:字符界面和圖形界面。啓動命令分別如下:

  a 圖形界面:

java junit.swingui.TestRunner XXXXX

  b 字符界面:

java junit.textui.TestRunner XXXXX

  2. 使用例子:

import junit.frmework.TestCase;

public class TestSample extends TestCaset{

public void testMethod1(){

assertTrue( true);

}

}

  3. setUp與tearDown,這兩個函數是junit framework中提供初始化和反初始化每個測試方法的。

setUp在每個測試方法調用前被調用,負責初始化測試方法所需要的測試環境;

tearDown在每個測試方法被調用之後被調用,負責撤銷測試環境。它們與測試方法的關係可以描述如下:

  測試開始 -> setUp -> testXXXX -> tearDown ->測試結束

  4. 使用例子:

import junit.frmework.TestCase;

public class TestSample extends TestCaset{

protected void setUp(){

//初始化……

}

public void testMethod1(){

assertTrue( true);

}

potected void tearDown(){

//撤銷初始化……

}

}

5. 區分fail、exception。

  - fail,期望出現的錯誤。產生原因:assert函數出錯(如assertFalse(true));

fail函數產生(如fail(……))。

  - exception,不期望出現的錯誤,屬於unit test程序運行時拋出的異常。

它和普通代碼運行過程中拋出的runtime異常屬於一種類型。

  對於assert、fail等函數請參見junit的javadoc。

  6. 使用例子:

import junit.frmework.TestCase;

public class TestSample extends TestCaset{

protected void setUp(){

//初始化……

}

public void testMethod1(){

……

try{

boolean b= ……

assertTrue( b);

throw new Exception( “This is a test.”);

fail( “Unable point.”); //不可能到達

}catch(Exception e){

fail( “Yes, I catch u”); //應該到達點

}

……

}

potected void tearDown(){

//撤銷初始化……

}

}

  7. 組裝TestSuite,運行更多的test。在junit中,Test、TestCase和TestSuite三者組成了composiste pattern。

通過組裝自己的TestSuite,可以完成對添加到這個TestSuite中的所有的TestCase的調用。

而且這些定義的TestSuite還可以組裝成更大的TestSuite,這樣同時也方便了對於不斷增加的TestCase的管理

和維護。

  它的另一個好處就是,可以從這個TestCase樹的任意一個節點(TestSuite或TestCase)開始調用,

來完成這個節點以下的所有TestCase的調用。提高了unit test的靈活性。

  8. 使用例子:

 

 

import junit.framework.Test;

import junit.framework.TestSuite;

public class TestAll{

public class TestAll{

//定義一個suite,對於junit的作用可以視爲類似於java應用程序的main。

public static Test suite(){

TestSuite suite = new TestSuite("Running all tests.");

suite.addTestSuite( TestCase1.class);

suite.addTestSuite( TestCase2.class);

return suite;

}

}

  運行同運行單獨的一個TestCase是一樣的,參見step 1 “運行”。

  9. 使用Ant junit task。我們除了使用java來直接運行junit之外,我們還可以使用junit提供的junit task

與ant結合來運行。涉及的幾個主要的ant task如下:

  - <junit>,定義一個junit task

  - <batchtest>,位於<junit>中,運行多個TestCase

  - <test>,位於<junit>中,運行單個TestCase

  - <formatter>,位於<junit>中,定義一個測試結果輸出格式

  - <junitreport>,定義一個junitreport task

  - <report>,位於<junitreport>中,輸出一個junit report

  具體的語法請參見相關文檔。

  10. 使用例子:

<junit printsummary="yes" haltonfailure="no">

<classpath>

<path refid="classpath"/>

<pathelement location="${dist.junit}"/>

</classpath>

<formatter type="brief" usefile="false"/>

<formatter type="xml"/>

<batchtest todir="${doc.junitReport}">

<fileset dir="${dist.junit}" includes="**/*Test.class" />

</batchtest>

</junit>

<junitreport todir="${doc.junitReport}">

<fileset dir="${doc.junitReport}">

<include name="TEST*-*.xml"/>

</fileset>

<report format="frames" styledir="${junit.styleDir}" todir="${doc.junitReport}"/>

</junitreport>

檢查表

  junit的使用並不很難,然而要書寫一個好的TestCase卻並非易事。一個不好的TestCase往往是既浪費了時間,也起不

了實際的作用。相反,一個好的TestCase,不僅可以很好的指出代碼中存在的問題,

而且也可以作爲代碼更準確的文檔,同時還在

  - 測試的獨立性:一次只測試一個對象,方便定位出錯的位置。這有2層意思:一個TestCase,

只測試一個對象;一個TestMethod,只測試這個對象中的一個方法。

  - 給測試方法一個合適的名字。

  - 在assert函數中給出失敗的原因,如:assertTrue( “… should be true”, ……),方便查錯。

在這個例子中,如果無法通過assertTrue,那麼給出的消息將被顯示。在junit中每個assert函數都有

第一個參數是出錯時顯示消息的函數原型。

  - 測試所有可能引起失敗的地方,如:一個類中頻繁改動的函數。對於那些僅僅只含有getter/setter的類,

如果是由IDE(如Eclipse)產生的,則可不測;如果是人工寫,那麼最好測試一下。

  - 在setUp和tearDown中的代碼不應該是與測試方法相關的,而應該是全局相關的。如針對與測試方法A和B,

在setUp和tearDown中的代碼應該是A和B都需要的代碼。

  - 測試代碼的組織:相同的包,不同的目錄。這樣,測試代碼可以訪問被測試類的protected變量/方法,

方便測試代碼的編寫。放在不同的目錄,則方便了測試代碼的管理以及代碼的打包和發佈。一個例子如下:

src <=源代碼根目錄

|---com

|---mod1

|---class1

junit <=測試代碼根目錄

|---com

|---mod1

|---class1

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