閑人野居
          好好學(xué)習(xí),天天向上
          posts - 57,  comments - 137,  trackbacks - 0
          ??? JUnit 4 已經(jīng)出來很久了,基本上很多ide都開始支持,當(dāng)然為了兼容性,一直不太敢用。以前都是懶得寫單元測(cè)試,大多數(shù)的時(shí)候都是 System.out.print。不過現(xiàn)在已經(jīng)是測(cè)試驅(qū)動(dòng)的時(shí)代了,為了保持一個(gè)良好的習(xí)慣,還是需要好好的寫寫單元測(cè)試。斷言遠(yuǎn)比 System.out.print有用。
          ??? 看了幾篇文章之后,對(duì)JUnit4已經(jīng)有了基本的概念了。其實(shí)很多特性,testNg都已經(jīng)實(shí)現(xiàn)了,挺討厭testNg的xml文件,不過testNg的靈活性還是強(qiáng)大,對(duì)于大面積的組件測(cè)試比較適合。
          ??? JUnit 4應(yīng)該說是使用新的架構(gòu)寫的,使用了很多java5的新特性。
          ??? 一個(gè)最關(guān)鍵的改變,測(cè)試類,可以不用繼承那該死的TestCase了.測(cè)試類,可以更加靈活,方法的定義不需要在前面增加test了。
          ??? 對(duì)于測(cè)試類來說,只需要做以下簡(jiǎn)單的動(dòng)作:
          ??? 增加一個(gè)@Test,用于標(biāo)注相應(yīng)的測(cè)試方法。使用Assert類,來進(jìn)行斷言。
          ???

          import org.junit.Assert;

          public class AdditionTest {

          ? private int x = 1;

          ? private int y = 1;

          ? @Test public void addition() {

          ??? int z = x + y;

          ??? Assert.assertEquals(2, z);

          ? }

          }


          當(dāng)然可以使用java 5的static import 功能

          import static org.junit.Assert.*;

          public class AdditionTest {

          ? private int x = 1;

          ? private int y = 1;

          ? @Test public void addition() {

          ??? int z = x + y;

          ??? assertEquals(2, z);

          ? }

          }


          對(duì)于setUp 和tearDown來說,以后可以不用再繼承這兩個(gè)方法了。可以使用自定義的方法,只需要在前面增加@Before 和@After 注釋即可。

          ?

          @Before protected void initialize() {

          ??? System.setErr(new PrintStream(new ByteArrayOutputStream()));??

          ??? inputDir = new File("data");

          ??? inputDir = new File(inputDir, "xslt");

          ??? inputDir = new File(inputDir, "input");

          ???????

          }


          ?

          @After protected void disposeDocument() {

          ? doc = null;

          ? System.gc();??

          }


          并且可以注釋多個(gè)方法。

          ??? 當(dāng)然JUnit4 也引入了一個(gè) JUnit 3 中沒有的新特性:類范圍的 setUp() tearDown() 方法。任何用 @BeforeClass 注釋的方法都將在該類中的測(cè)試方法運(yùn)行之前剛好運(yùn)行一次,而任何用 @AfterClass 注釋的方法都將在該類中的所有測(cè)試都運(yùn)行之后剛好運(yùn)行一次。
          ???
          例 如,假設(shè)類中的每個(gè)測(cè)試都使用一個(gè)數(shù)據(jù)庫(kù)連接、一個(gè)網(wǎng)絡(luò)連接、一個(gè)非常大的數(shù)據(jù)結(jié)構(gòu),或者還有一些對(duì)于初始化和事情安排來說比較昂貴的其他資源。不要在每 個(gè)測(cè)試之前都重新創(chuàng)建它,您可以創(chuàng)建它一次,并還原它一次。該方法將使得有些測(cè)試案例運(yùn)行起來快得多。

          ?

          // This class tests a lot of error conditions, which

          // Xalan annoyingly logs to System.err. This hides System.err

          // before each test and restores it after each test.

          private PrintStream systemErr;

          @BeforeClass protected void redirectStderr() {

          ??? systemErr = System.err; // Hold on to the original value

          ??? System.setErr(new PrintStream(new ByteArrayOutputStream()));

          }?

          @AfterClass protected void tearDown() {

          ??? // restore the original value

          ??? System.setErr(systemErr);

          }


          ??? 異常測(cè)試是 JUnit 4 中的最大改進(jìn)。舊式的異常測(cè)試是在拋出異常的代碼中放入 try 塊,然后在 try 塊的末尾加入一個(gè) fail() 語(yǔ)句。
          該方法不僅難看,而且試圖挑戰(zhàn)代碼覆蓋工具,因?yàn)椴还軠y(cè)試是通過還是失敗,總有一些代碼不被執(zhí)行。 JUnit 4 中,您現(xiàn)在可以編寫拋出異常的代碼,并使用注釋來聲明該異常是預(yù)期的:

          ?

          @Test(expected=ArithmeticException.class)

          ? public void divideByZero() {

          ??? int n = 2 / 0;

          }


          ??? 如果該異常沒有拋出(或者拋出了一個(gè)不同的異常),那么測(cè)試就將失敗。但是如果您想要測(cè)試異常的詳細(xì)消息或其他屬性,則仍然需要使用舊式的 try-catch 樣式。
          ??? 測(cè)試性能 是單元測(cè)試最為痛苦的方面之一。JUnit 4 沒有完全解決這個(gè)問題,但是它對(duì)這個(gè)問題有所幫助。測(cè)試可以用一個(gè)超時(shí)參數(shù)來注釋。如果測(cè)試運(yùn)行的時(shí)間超過指定的毫秒數(shù),則測(cè)試失敗。

          ?

          @Test(timeout=500) public void retrieveAllElementsInDocument() {

          ??? doc.query("http://*");

          }


          基本的特性就這么多,這些功能其實(shí)都可以在testNg中找到。不過JUnit還是不錯(cuò)的,對(duì)于單元測(cè)試來說,這是首選的。

          當(dāng)然為了兼容性,為了使 JUnit 4 測(cè)試可以運(yùn)行在 JUnit 3 環(huán)境中,可以將它們包裝在 JUnit4TestAdapter 中。將下面的方法添加到您的 JUnit 4 測(cè)試類中應(yīng)該就足夠了:

          ?

          public static junit.framework.Test suite() {

          ? return new JUnit4TestAdapter(AssertionTest.class);???

          }



          posted on 2006-10-03 10:36 布衣郎 閱讀(2678) 評(píng)論(7)  編輯  收藏 所屬分類: 單元測(cè)試

          FeedBack:
          # re: Junit 4新的特性
          2006-10-03 13:14 | pear
          請(qǐng)問:Eclipse的編輯器怎么支持 @Test 類似的語(yǔ)法呀?
          Eclipse 支持 @Override 但是怎么讓他支持 @Test/@Before/@After呢?  回復(fù)  更多評(píng)論
            
          # re: Junit 4新的特性
          2006-10-03 15:17 | Supergoal
          @pear
          用快捷鍵Ctrl + Shit + O,import相應(yīng)的class即可。  回復(fù)  更多評(píng)論
            
          # re: Junit 4新的特性
          2006-10-03 15:19 | Supergoal
          請(qǐng)問樓主的代碼自己運(yùn)行過嗎?你確定@BeforeClass這個(gè)Annotation可以用在非靜態(tài)函數(shù)上面嗎?我試下來似乎不行。  回復(fù)  更多評(píng)論
            
          # re: Junit 4新的特性
          2006-10-03 19:16 | 布衣郎
          @Supergoal

          不錯(cuò),我這里只是貼了文章中的幾個(gè)例子而已,并沒有做過試驗(yàn)。抱歉,今天特意試了一下。在eclipse中,運(yùn)行,beforeClass和afterClass 只能用于static方法,而且好像before 和after 只有用于public 方法,沒有試過在外面執(zhí)行junit。
          這點(diǎn)感覺就沒有testng那么好了。  回復(fù)  更多評(píng)論
            
          # re: Junit 4新的特性
          2006-10-03 19:21 | 布衣郎
          @pear
          eclipse 3.2已經(jīng)支持junit4 了,只要把junit4 的包引入就可以,一般我建立兩個(gè)classpath variables。JUNIT4_HOME:D:/eclipse/plugins/org.junit4_4.1.0
          JUNIT4_SRC_HOME:D:/eclipse/plugins/org.eclipse.jdt.source_3.2.0.v20060609m-F7snq1fxia-Z4XP/src/org.junit4_4.1.0
          在項(xiàng)目中加入這兩個(gè)變量就可以了。

          創(chuàng)建testCase時(shí),選擇new Junit4 test就行了。  回復(fù)  更多評(píng)論
            
          # re: Junit 4新的特性
          2006-10-04 19:05 | pear
          沒問題了,原來是沒有引入包,呵,不好意思。。謝謝摟住。。  回復(fù)  更多評(píng)論
            
          # re: Junit 4新的特性
          2006-10-04 20:33 | 冰川
          支持一下!  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          <2006年10月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          常用鏈接

          留言簿(12)

          隨筆分類(59)

          隨筆檔案(57)

          blog

          java

          uml

          搜索

          •  

          積分與排名

          • 積分 - 357327
          • 排名 - 155

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 多伦县| 双桥区| 弋阳县| 枝江市| 收藏| 广丰县| 抚州市| 林甸县| 鸡东县| 西乡县| 托里县| 娱乐| 扶风县| 观塘区| 水城县| 阿鲁科尔沁旗| 阳新县| 景德镇市| 山丹县| 红安县| 墨玉县| 祁东县| 庆阳市| 万荣县| 惠东县| 安泽县| 桦甸市| 乌审旗| 新田县| 泌阳县| 浠水县| 东明县| 同心县| 乡城县| 时尚| 万源市| 石城县| 华容县| 西丰县| 富蕴县| 信阳市|