閑人野居
          好好學習,天天向上
          posts - 57,  comments - 137,  trackbacks - 0
          ?????? TestNG是一個不錯的測試框架,尤其是用于模塊測試,以及大范圍的測試。相對于JUnit來說,更為靈活。隨著JUnit4的推出,很多功能都與TestNG相似,但相對于JUnit4,TestNG還是有很多部分是有區別的。
          ????? TestNG的IDE支持也不錯,對于Eclipse,Idea,Ant都有很好的支持。
          ????? 先來看一看怎么使用TestNG,當然首先需要下載TestNG包。目前的版本為5.1,下載地址如下:
          ? ? ? http://testng.org/doc/download.html ,也可以下載相應的Eclipse插件。
          ????? 運行TestNG,可以從命令行或者IDE,或者Ant中運行。
          ????? 命令行:
          ????? java org.testng.TestNG -groups windows,linux -testclass org.test.MyTest
          ?????
          對于大型的測試,需要定義一個xml文件,一般為testng.xml。
          ???


          <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
          ?
          <suitename="Suite1"?? verbose="1" >
          <testname="Nopackage" >
          <classes>
          ???????<classname="NoPackageTest"? />
          </classes>
          </test>

          <testname="Regression1"?? >
          <classes>
          <classname="test.sample.ParameterSample"? />
          <classname="test.sample.ParameterTest" />
          </classes>
          </test>
          </suite>

          ???? java org.testng.TestNG testng.xml
          ???
          ? 當然如果使用Eclipse插件,就簡單多了。

          ????? 下面來看一下,如何來實現測試的,與JUnit4 差不多(懷疑,JUnit4是不是有抄襲TestNG的成分)。
          ??? ? 聲明測試方法如下:


            @Test
          public void testMethod1() {
          System.out.println("in testMethod1");
          }

          @Test
          public void testMethod2() {
          System.out.println("in testMethod2");
          }

          ???? 基本上都是采用java5的注釋實現的。
          ???? 與JUnit4 不同在于,測試方法可以分組,它可以根據諸如運行時間這樣的特征來對測試分類。

            @Test(groups={"fun1","fun2"})
          public void testMethod1() {
          System.out.println("in testMethod1");
          }

          @Test(groups={"fun1"})
          public void testMethod2() {
          System.out.println("in testMethod2");
          }

          ????? 同JUnit4 一樣,同樣支持Before,After方法,如同setUp 和tearDown,不過TestNG更為靈活,支持各種簽名方式,如private,protected。
          ??? @BeforeMethod
          ??? protected void beforeMethod() {
          ??????? System.out.println("in beforeMethod");
          ??? }

          ??? @AfterMethod
          ??? protected void afterMethod() {
          ??????? System.out.println("in afterMethod");
          ??? }

          ???? 同樣也支持BeforeClass 和AfterClass,只執行一次的方法,但是可以不需要使用static簽名
          ??? @BeforeClass
          ??? protected void beforeClassMethod() {
          ??????? System.out.println("in beforeClassMethod");
          ??? }

          ??? @AfterClass
          ??? protected void afterClassMethod() {
          ??????? System.out.println("in afterClassMethod");
          ??? }

          ???? 不同于JUnit4,TestNG提供了以下的特性:
          ???? 依賴性測試
          ????
          JUnit 框架想達到的一個目標就是測試隔離。它的缺點是:人們很難確定測試用例執行的順序,而這對于任何類型的依賴性測試都非常重要。開發者們使用了多種技術來解決這個問題,例如,按字母順序指定測試用例,或是更多地依靠 fixture 來適當地解決問題。
          ????? 與 JUnit 不同,TestNG 利用 Test 注釋的 dependsOnMethods 屬性來應對測試的依賴性問題。有了這個便利的特性,就可以輕松指定依賴方法。如以下定義:testMethod2依賴于testMethod1。
          ???
          ??? @Test
          ??? public void testMethod1() {
          ??????? System.out.println("in testMethod1");
          ??? }

          ??? @Test(dependsOnMethods="testMethod1")
          ??? public void testMethod2() {
          ??????? System.out.println("in testMethod2");
          ??? }
          當然如果testMethod1失敗的話,默認testMethod2也不會執行,不過只需要設置alwaysRun = true,則可以跳過testMethod1

          ??? @Test
          ??? public void testMethod1() {
          ??????? System.out.println("in testMethod1");
          ??????? throw new RuntimeException("failed");
          ??? }

          ??? @Test(dependsOnMethods="testMethod1",alwaysRun = true)
          ??? public void testMethod2() {
          ??????? System.out.println("in testMethod2");
          ??? }

          ???? 失敗和重運行
          ????
          在大型測試套件中,這種重新運行失敗測試的能力顯得尤為方便。這是 TestNG 獨有的一個特性。在 JUnit 4 中,如果測試套件包括 1000 項測試,其中 3 項失敗,很可能就會迫使您重新運行整個測試套件(修改錯誤以后)。不用說,這樣的工作可能會耗費幾個小時。

          一旦 TestNG 中出現失敗,它就會創建一個 XML 配置文件,對失敗的測試加以說明。如果利用這個文件執行 TestNG 運行程序,TestNG 就 運行失敗的測試。所以,在前面的例子里,您只需重新運行那三個失敗的測試,而不是整個測試套件。可以看到以下的失敗文件,一般命名為testng-failed.xml,以后只需要運行此文件就可以了。

          <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
          <suite thread-count="5" verbose="1" name="Failed suite [testng]" parallel="false" annotations="JDK5">
          ? <test name="demo.testng.Test2(failed)" junit="false" parallel="false" annotations="JDK5">
          ??? <classes>
          ????? <class name="demo.testng.Test2">
          ??????? <methods>
          ????????? <include name="testMethod1"/>
          ????????? <include name="testMethod2"/>
          ????????? <include name="beforeClassMethod"/>
          ????????? <include name="afterClassMethod"/>
          ????????? <include name="beforeMethod"/>
          ????????? <include name="afterMethod"/>
          ??????? </methods>
          ????? </class>
          ??? </classes>
          ? </test>
          </suite>

          ??? 參數化測試
          ???
          TestNG 中另一個有趣的特性是參數化測試。在 JUnit 中,如果您想改變某個受測方法的參數組,就只能給每個 不同的參數組編寫一個測試用例。多數情況下,這不會帶來太多麻煩。然而,我們有時會碰到一些情況,對其中的業務邏輯,需要運行的測試數目變化范圍很大。
          ??? 在這樣的情況下,使用 JUnit 的測試人員往往會轉而使用 FIT 這樣的框架,因為這樣就可以用表格數據驅動測試。但是 TestNG 提供了開箱即用的類似特性。通過在 TestNG 的 XML 配置文件中放入參數化數據,就可以對不同的數據集重用同一個測試用例,甚至有可能會得到不同的結果。這種技術完美地避免了只能 假定一切正常的測試,或是沒有對邊界進行有效驗證的情況。


          ?? @Parameters( { "first-name"
          ??? })

          ??? @Test(groups = { "param"
          ??? })
          ??? public void testParm(String firstName) {
          ??????? System.out.println("invoked testString:" + firstName);
          ??????? assertEquals(firstName, "Test");
          ??? }

          在xml中設置相應的參數值,可以放入suite下面或者test下面,如果同名,一般test下面的定義覆蓋suite定義。

          <parameter name="first-name" value="Test"/>

          ??? 高級參數化測試
          ??? 盡管從一個 XML 文件中抽取數據會很方便,但偶爾會有些測試需要有復雜類型,這些類型無法用 String 或原語值來表示。TestNG 可以通過它的 @DataProvider 注釋處理這樣的情況。@DataProvider 注釋可以方便地把復雜參數類型映射到某個測試方法。例如,清單 7 中的 verifyHierarchy 測試中,我采用了重載的 buildHierarchy 方法,它可接收一個 Class 類型的數據, 它斷言(asserting)Hierarchy getHierarchyClassNames() 方法應該返回一個適當的字符串數組:
          package test.com.acme.da.ng;

          import java.util.Vector;

          import static org.testng.Assert.assertEquals;
          import org.testng.annotations.DataProvider;
          import org.testng.annotations.Test;

          import com.acme.da.hierarchy.Hierarchy;
          import com.acme.da.hierarchy.HierarchyBuilder;

          public class HierarchyTest {

          @DataProvider(name = "class-hierarchies")
          public Object[][] dataValues(){
          return new Object[][]{
          {Vector.class, new String[] {"java.util.AbstractList",
          "java.util.AbstractCollection"}},
          {String.class, new String[] {}}
          };
          }

          @Test(dataProvider = "class-hierarchies")
          public void verifyHierarchy(Class clzz, String[] names)
          throws Exception{
          Hierarchy hier = HierarchyBuilder.buildHierarchy(clzz);
          assertEquals(hier.getHierarchyClassNames(), names,
          "values were not equal");
          }
          }

          ???? 當然還有一些其他的特性,就不一一詳細說明了,有興趣可以參考相應的testNG文檔。
          ????? JUnit 4 和 TestNG 在表面上是相似的。然而,設計 JUnit 的目的是為了分析代碼單元,而 TestNG 的預期用途則針對高級測試。對于大型測試套件,我們不希望在某一項測試失敗時就得重新運行數千項測試,TestNG 的靈活性在這里尤為有用。這兩個框架都有自己的優勢,您可以隨意同時使用它們。
          posted on 2006-10-05 15:44 布衣郎 閱讀(5795) 評論(5)  編輯  收藏 所屬分類: 單元測試

          FeedBack:
          # re: 關于TestNG
          2006-10-07 09:39 | aa
          大部分人還是在用jdk1.4甚至jdk1.3在開發  回復  更多評論
            
          # re: 關于TestNG
          2006-10-07 18:40 | 布衣郎
          @aa
          可能有些應用部署可能還得用jdk1.4或者1.3,不過估計很快jdk5會普及??纯船F在的框架,很多都已經使用jdk5了。  回復  更多評論
            
          # re: 關于TestNG
          2008-04-01 20:48 | 叮當小馬
          路過,學習下,不過,還不錯。  回復  更多評論
            
          # re: 關于TestNG
          2008-06-21 22:33 | rocksun
          我們的網站正在嘗試在開源測試領域做一些事情,期望大家的參與。
          http://process2.cn
            回復  更多評論
            
          # re: 關于TestNG
          2011-07-12 15:03 | yu
          總結得不錯,讓我理解更深入一層,謝謝樓主!  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           

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

          常用鏈接

          留言簿(12)

          隨筆分類(59)

          隨筆檔案(57)

          blog

          java

          uml

          搜索

          •  

          積分與排名

          • 積分 - 357333
          • 排名 - 155

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 思茅市| 虹口区| 太康县| 徐汇区| 宜宾市| 鹿泉市| 吕梁市| 天气| 和硕县| 那曲县| 德江县| 夏河县| 新宾| 涪陵区| 安徽省| 连南| 永靖县| 长葛市| 昌黎县| 信阳市| 报价| 松阳县| 来宾市| 克东县| 高唐县| 贞丰县| 景谷| 冀州市| 阜南县| 九龙坡区| 苗栗县| 开原市| 延吉市| 河南省| 江门市| 湘潭县| 南昌县| 淮安市| 吴桥县| 个旧市| 望城县|