隨筆 - 154  文章 - 60  trackbacks - 0
          <2008年3月>
          2425262728291
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          聲明:

          該blog是為了收集資料,認識朋友,學習、提高技術,所以本blog的內容除非聲明,否則一律為轉載!!

          感謝那些公開自己技術成果的高人們!!!

          支持開源,尊重他人的勞動!!

          常用鏈接

          留言簿(3)

          隨筆分類(148)

          隨筆檔案(143)

          收藏夾(2)

          其他

          學習(技術)

          觀察思考(非技術)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          JUnit是什么?

          cherami


          JUnit是一個開發源代碼的Java測試框架,用于編寫和運行可重復的測試。他是用于單元測試框架體系xUnit的一個實例(用于java語言)。它包括以下特性:
          1、用于測試期望結果的斷言(Assertion)
          2、用于共享共同測試數據的測試工具
          3、用于方便的組織和運行測試的測試套件
          4、圖形和文本的測試運行器

          JUnit最初是由Erich Gamma(GoF之一)和Kent Beck(xp和refactor的先驅之一)編寫的.

          需要說明的是junit一般是用來進行單元測試的,因此需要了解被測試代碼的內部結構(即所謂的白盒測試),另外junit是在xp編程和重構(refactor)中被極力推薦使用的工具,因為在實現自動單元測試的情況下可以大大的提高開發的效率,但是實際上編寫測試代碼也是需要耗費很多的時間和精力的,那么使用這個東東好處到底在哪里呢?筆者認為是這樣的:
          1、對于xp編程而言,要求在編寫代碼之前先寫測試,這樣可以強制你在寫代碼之前好好的思考代碼(方法)的功能和邏輯,否則編寫的代碼很不穩定,那么你需要同時維護測試代碼和實際代碼,這個工作量就會大大增加。因此在xp編程中,基本過程是這樣的:構思-》編寫測試代碼-》編寫代碼-》測試,而且編寫測試和編寫代碼都是增量式的,寫一點測一點,在編寫以后的代碼中如果發現問題可以較塊的追蹤到問題的原因,減小回歸錯誤的糾錯難度
          2、對于重構而言,其好處和xp編程中是類似的,因為重構也是要求改一點測一點,減少回歸錯誤造成的時間消耗。
          3、對于非以上兩種情況,我們在開發的時候使用junit寫一些適當的測試也是有必要的,因為一般我們也是需要編寫測試的代碼的,可能原來不是使用的junit,如果使用junit,而且針對接口(方法)編寫測試代碼會減少以后的維護工作,例如以后對方法內部的修改(這個就是相當于重構的工作了)。另外就是因為junit有斷言功能,如果測試結果不通過會告訴我們那個測試不通過,為什么,而如果是想以前的一般做法是寫一些測試代碼看其輸出結果,然后再由自己來判斷結果使用正確,使用junit的好處就是這個結果是否正確的判斷是它來完成的,我們只需要看看它告訴我們結果是否正確就可以了,在一般情況下會大大提高效率。


          JUnit入門

          cherami 整理


          安裝JUnit

          安裝很簡單,先到以下地址下載一個最新的zip包:
          http://download.sourceforge.net/junit/
          下載完以后解壓縮到你喜歡的目錄下,假設是JUNIT_HOME,然后將JUNIT_HOME下的junit.jar包加到你的系統的CLASSPATH環境變量中,對于IDE環境,對于需要用到的junit的項目增加到lib中,其設置不同的IDE有不同的設置,這里不多講。


          如何使用JUnit寫測試?

          最簡單的范例如下:
          1、創建一個TestCase的子類:
          package junitfaq;

          import java.util.*;
          import junit.framework.*;

          public class SimpleTest extends TestCase {

          public SimpleTest(String name) {
          super(name);
          }


          2、寫一個測試方法斷言期望的結果:
          public void testEmptyCollection() {
          Collection collection = new ArrayList();
          assertTrue(collection.isEmpty());
          }
          注意:JUnit推薦的做法是以test作為待測試的方法的開頭,這樣這些方法可以被自動找到并被測試。

          3、寫一個suite()方法,它會使用反射動態的創建一個包含所有的testXxxx方法的測試套件:
          public static Test suite() {
          return new TestSuite(SimpleTest.class);
          }

          4、寫一個main()方法以文本運行器的方式方便的運行測試:
          public static void main(String args[]) {
          junit.textui.TestRunner.run(suite());
          }
          }

          5、運行測試:
          以文本方式運行:
          java junitfaq.SimpleTest

          通過的測試結果是:

          .
          Time: 0

          OK (1 tests)

          Time上的小點表示測試個數,如果測試通過則顯示OK。否則在小點的后邊標上F,表示該測試失敗。
          每次的測試結果都應該是OK的,這樣才能說明測試是成功的,如果不成功就要馬上根據提示信息進行修正了。
          如果JUnit報告了測試沒有成功,它會區分失敗(failures)和錯誤(errors)。失敗是你的代碼中的assert方法失敗引起的;而錯誤則是代碼異常引起的,例如ArrayIndexOutOfBoundsException。


          以圖形方式運行:

          java junit.swingui.TestRunner junitfaq.SimpleTest

          通過的測試結果在圖形界面的綠色條部分。

           

          以上是最簡單的測試樣例,在實際的測試中我們測試某個類的功能是常常需要執行一些共同的操作,完成以后需要銷毀所占用的資源(例如網絡連接、數據庫連接,關閉打開的文件等),TestCase類給我們提供了setUp方法和tearDown方法,setUp方法的內容在測試你編寫的TestCase子類的每個testXxxx方法之前都會運行,而tearDown方法的內容在每個testXxxx方法結束以后都會執行。這個既共享了初始化代碼,又消除了各個測試代碼之間可能產生的相互影響。

          JUnit最佳實踐

           

          Martin Fowler說過:“當你試圖打印輸出一些信息或調試一個表達式時,寫一些測試代碼來替代那些傳統的方法。”一開始,你會發現你總是要創建一些新的Fixture,而且測試似乎使你的編程速度慢了下來。然而不久之后,你會發現你重復使用相同的Fixture,而且新的測試通常只涉及添加一個新的測試方法。 

          你可能會寫許多測試代碼,但你很快就會發現你設想出的測試只有一小部分是真正有用的。你所需要的測試是那些會失敗的測試,即那些你認為不會失敗的測試,或你認為應該失敗卻成功的測試。

          我們前面提到過測試是一個不會中斷的過程。一旦你有了一個測試,你就要一直確保其正常工作,以檢驗你所加入的新的工作代碼。不要每隔幾天或最后才運行測試,每天你都應該運行一下測試代碼。這種投資很小,但可以確保你得到可以信賴的工作代碼。你的返工率降低了,你會有更多的時間編寫工作代碼。

          不要認為壓力大,就不寫測試代碼。相反編寫測試代碼會使你的壓力逐漸減輕,應為通過編寫測試代碼,你對類的行為有了確切的認識。你會更快地編寫出有效率地工作代碼。

          下面是一些具體的編寫測試代碼的技巧或較好的實踐方法:

          1. 不要用TestCase的構造函數初始化Fixture,而要用setUp()和tearDown()方法。

          2. 不要依賴或假定測試運行的順序,因為JUnit利用Vector保存測試方法。所以不同的平臺會按不同的順序從Vector中取出測試方法。

          3. 避免編寫有副作用的TestCase。例如:如果隨后的測試依賴于某些特定的交易數據,就不要提交交易數據。簡單的會滾就可以了。

          4. 當繼承一個測試類時,記得調用父類的setUp()和tearDown()方法。

          5. 將測試代碼和工作代碼放在一起,一邊同步編譯和更新。(使用Ant中有支持junit的task.)

          6. 測試類和測試方法應該有一致的命名方案。如在工作類名前加上test從而形成測試類名。

          7. 確保測試與時間無關,不要依賴使用過期的數據進行測試。導致在隨后的維護過程中很難重現測試。

          8. 如果你編寫的軟件面向國際市場,編寫測試時要考慮國際化的因素。不要僅用母語的Locale進行測試。

          9. 盡可能地利用JUnit提供地assert/fail方法以及異常處理的方法,可以使代碼更為簡潔。
           
          10.測試要盡可能地小,執行速度快。


          JUnit和ant結合

          cherami 轉貼


          ant 提供了兩個 target : junit 和 junitreport
          運行所有 測試用例 ,并生成 html 格式的報表
          具體操作如下:

          1.將 junit.jar 放在 ANT_HOME\lib 目錄下
          2.修改 build.xml ,加入如下 內容:


          <property name="report" value="report" /> <target name="junitreport" depends="clean, compile"> <junit printsummary="on" fork="true" haltonfailure="false" failureproperty="tests.failed" showoutput="true"> <classpath refid="myclasspath"/> <formatter type="xml"/> <batchtest todir="${report}"> <fileset dir="${build}"> <include name="**/*Test.*"/> </fileset> </batchtest> </junit> <junitreport todir="${report}"> <fileset dir="${report}"> <include name="TEST-*.xml"/> </fileset> <report format="frames" todir="${report}"/> </junitreport> <fail if="tests.failed"> --------------------------------------------------------- One or more tests failed, check the report for detail... --------------------------------------------------------- </fail> </target>

          運行 這個 target ,ant 會運行每個 TestCase
          在 report 目錄下就有了 很多 TEST*.xml 和 一些網頁
          打開 report 目錄下的 index.html 就可以看到很直觀的測試運行報告,一目了然。


          本文來自: 中國自學編程網(www.zxbc.cn) 詳細出處參考:http://www.zxbc.cn/html/rjgc/1414044315681.htm

          posted on 2008-03-31 16:38 lk 閱讀(542) 評論(0)  編輯  收藏 所屬分類: j2se
          主站蜘蛛池模板: 武清区| 青铜峡市| 宁强县| 会理县| 连江县| 灵川县| 广安市| 三穗县| 高密市| 玉环县| 黄大仙区| 东兰县| 犍为县| 瑞昌市| 阿拉善左旗| 盘山县| 广河县| 宣城市| 长沙市| 绵竹市| 怀安县| 建瓯市| 景泰县| 望奎县| 湘阴县| 鸡泽县| 象山县| 普宁市| 临高县| 大新县| 旬邑县| 收藏| 忻州市| 正定县| 苏尼特右旗| 长治县| 昭通市| 始兴县| 德惠市| 江川县| 吉水县|