Testng與Junit區別【轉載】

轉自 http://www.blogjava.net/fanscial/archive/2005/12/14/23780.html

  1.     JDK 5 Annotations (JDK 1.4 可以用JavaDoc代替).
    

一個典型的Junit的測試類

import junit.framework.TestCase;
public class Jtest extends TestCase {
 
       protected void setUp() throws Exception {
              super.setUp();
                     //some initial code
    }

    protected void tearDown() throws Exception {
        super.tearDown ();
        //release resource and rollback
}
  
public void testFunction {
       //test code
}
 
}

對應的TestNG的測試類,我們寫最簡單的情況。

public class NGtest{
   
 @Configuration(beforeTestClass=true)
    public void setUp() {
        //some initial code
}
 
@Configuration(afterTestClass = true)
    public void tearDown (){
       //release resource and rollback
    }
 
    @Test( )
    public void testFunction (){
       //test code
    }
 
}

這樣寫可以比較明顯的看到兩者的對應關系(注意TestNG的方法的名字是可以隨便取的,取一樣的名字只是為了讓你容易找到對應的關系)

這說明TestNG是從Junit發展而來的,至少借鑒了很多Junit的思想(實際上TestNG的作者本身就是Junit的小組成員之一)。

我們從最表面的現象來看看吧

TestNG沒有繼承任何類,甚至接口!!

JDK 5 Annotations

這2者是息息相關的,為什么我們不用繼承任何類,因為信息都在注釋里面,這樣會帶來很多好處(絕不僅僅是命名的方便)。

  1.     靈活的test configuration
    

先看一下Junit的執行順序
Setup( ) test1( ) tearDown( ) Setup( ) test2( ) tearDown( )…………

下面是TestNG的

實際上外面還有一個beforeSuite和afterSuite的方法,是在測試項目開始的時候就運行了,實際上如果我的每個方法都要用到的初始化的代碼,為什么要運行那么多次,如果其中有EJB這種重量級的容器要初始化,效率差可想而知。事實上TestNG可以做到更加的靈活,就是分組。

  1.     TestNG 的靈魂 
    

配置文件(testng.xml)

Junit中要定義測試任務是要寫TestSuit的,居然要寫硬編碼,而TestNG全部寫在testng.xml(名字可以自定義的)中的,然后可以通過ant來調用。

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="my suite">
<test name="test1">
       <groups>
       <run name="group1">
       </run> 
       </groups> 
<classes>
<class name="ClassA"  /> 
</classes> 
</test> 
<test name="test2"  >
       <groups> 
       <run name="group2"> 
       </run> 
       </groups> 
<classes> 
<class name="ClassB"/> 
<class name="ClassC"/> 
</classes> 
</test> 
</suite>

上面包含了配置文件的基本的主干,一個配置文件只有一個Suite,基本上一個項目寫一個配置文件就可以了,當然如果你的項目足夠大,可能需要幾個配置文件。測試是按照從大到小的順序進行的,先執行suite,test,class,其中的group和class是平級的,在講group的時候再詳細的解釋。有了這個文件,我們就可以很清楚的理解@configuration里面的類型

public boolean beforeSuite() default false;
 
public boolean afterSuite() default false;
  
public boolean beforeTest() default false;
 
public boolean afterTest() default false;
  
public boolean beforeTestClass() default false;
 
public boolean afterTestClass() default false;
 
public boolean beforeTestMethod() default false;
 
public boolean afterTestMethod() default false;

從字面意思可以看出方法的執行順序,唯一的疑惑是執行的次數,官方的文檔的解釋是相當讓人疑惑的,好在我們可以自己測試,beforeTestMethod是當類中任何方法調用都要執行的,beforeTest和beforeTestClass在一個Test中是只執行一次的(沒試過把2個相同的類寫到一個Test里面),而beforeSuite在一個配置文件中只執行一次。上面都沒有考慮分組的情況,分組會更加的復雜,似乎靈活過頭了,但是考慮到項目的復雜性,每個測試方法的初始化都可能不同,現在我們做的項目要求每天要將單元測試寫進daily build的build文件里面自動執行,似乎只有用TestNG這樣靈活的配置才能達到。

  1.     分組
    

將一個測試方法或者配置方法分組是很容易的。

@Configuration(beforeTestClass=true,groups=“group1”)
@Test(groups=”group1”)

只要象上面寫就可以了,名字隨便取,而且不需要預先定義。
我們在一個類做2個組,看看效果

@Configuration(beforeTestClass=true,groups=“group1”)
Public void C1(){}

@Test(groups=”group1”)
Public void T1(){}

@Configuration(beforeTestClass=true,groups=“group2”)
Public void C2(){}

@Test(groups=”group2”)
Public void T2(){}

只選group1

…………………

      <groups>
      <run name="group1"> 
      </run> 
      </groups>

…………

   執行C1        T1

只選group2
…………………

       <groups> 
       <run name="group2"> 
       </run> 
       </groups>

…………

執行C2 T2

2個都選

…………………

       <groups> 
<run name="group1">
       <run name="group2"> 
       </run> 
       </groups> 

…………

我最先以為的順序是C1 T1 C2 T2 (A)

然而實際上是 C1 C2 T1 C1 C2 T2 (B)
要想達到(A)的效果,只能把2個group分開了放在不同的Test里面,其實只要知道一點,TestNG是先找Class,然后才去找Group的。

  1.     參數
    

Junit是不帶任何參數的,不論是測試方法還是配置方法,而TestNG都是可以添加參數的,有2種方法。

(1) 使用Parameter參數

@Parameters({ "first-name" })         
 @Test        
 public void testSingleString(String firstName) {         
          System.out.print("InvokedtestString+firstName); 
          assert "Cedric".equals(firstName);        
}         

參數的值放到配置文件中

<suite name="My suite">         
          <parameter name="first-name"  value="Cedric"/>        
         <test name="Simple example"> 

這種方法偶爾用之還可以,但是很遺憾的是第一只能傳String(可能可以其他的基本數據類型??但至少不能傳復雜對象),第二數據寫在配置文件中,不能所見即所得。
但是下面的方法真的給我們驚喜。

(2) DataProvider

這是從4.0以后增加的功能,看看怎么實現。

// This method will provide data to any test method that declares that its Data Provider
// is named "test1"
@DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
new Object[] { "Cedric", new Integer(36) },
new Object[] { "Anne", new Integer(37)}, 
};
}

// This test method declares that its data should be supplied by the Data Provider
// named "test1"
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
System.out.println(n1 + " " + n2);
}

執行的結果

Cedric 36
Anne 37

DataProvider返回的是個2維數組的對象,什么數據都可以提供了吧,而且可以讓你的測試方法執行多次。而且最重要的是和測試方法寫在一起,所見即所得。

  1.     Ant的集成和Daily Build
    

TestNG對Ant提供了很好的支持,這是我寫得測試用的Ant腳本

<project default="testng"> 
      <property file="build.properties" />
      <path id="cpath"> 
             <fileset dir="lib">
                     <include name="*.jar"/> 
             </fileset> 
      </path> 
//定義testng的任務

      <taskdef resource="testngtasks" classpath="lib/testng-4.4-jdk15.jar" /> 
      <target name="compile"> 
             <mkdir dir="test/classes"/>
              <javac destdir="test/classes" 
                           srcdir="${testng.dir}"
                                        debug="true"
                                        encoding="GBK" >
                   <classpath refid="cpath"/> 
             </javac>
      </target>
      //執行testng的任務

      <target name="testng" depends="compile">
             <testng classpath="test/classes"> 
                    <xmlfileset dir="${configure.dir}" includes="testing.xml" /> 
             </testng> 
      </target> 
</project>

簡單的不能在簡單了,你只要告訴ant來調用,然后告訴ant配置文件在哪里,剩下的事都交給testng自己的配置文件去做就行了,然后ant以后都不用修改了。不建議將任務的細節寫在ant里面,首先功能不如testng自己的配置文件強大,而且ant需要維護。

下面基本上是TestNG才有的特點了,和Junit沒有什么關系,但為了延續,還是用了上面的題目。
7 .依賴關系
先給個例子

@Test 
public void serverStartedOk() {}
@Test(dependsOnMethods = { "serverStartedOk" })

public void method1() {}

在這個例子中,method1()必須在serverStartedOk()執行后才能執行,而且serverStartedOk()不能fail,否則method1()會被skip掉

基本上類似于ant的依賴關系,也很容易理解,只是分為強依靠和弱依靠,區別是弱依靠只管執行的順序,強依靠除了順序,還要正確,否則后面的不執行,上面的例子是強依靠,下面是弱依靠,加上alwaysrun=”true”

@Test
public void serverStartedOk() {}

@Test(dependsOnMethods = { "serverStartedOk" },alwaysrun=”true”) 
public void method1() {}

如果有興趣,可以看看下面的文章,里面有有趣的爭論
http://beust.com/weblog/archives/000171.html

8.其他特性
還有很多,工廠模式,并行運行(Parallel running ),BeanShell 等等,感覺不是特別重要,而且寫了那么多感覺好累啊,就不寫了,有興趣的可以去看看官方的文檔。
http://testng.org/doc/documentation-main.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容

  • 感謝原作者的奉獻,原作者博客地址:http://blog.csdn.net/zhu_ai_xin_520/arti...
    狼孩閱讀 14,103評論 1 35
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,818評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,912評論 6 342
  • JUnit 4和TestNG都是Java中非常受歡迎的單元測試框架。兩種框架在功能上看起來非常相似。 哪一個更好?...
    易百教程閱讀 5,008評論 2 6
  • 今天是猴年的正月初一,凌晨四點半出發去霞浦的北岐灘涂等待日出。其實北岐距離縣城只有6km左右,之所以走這么早是因為...
    柬東來閱讀 3,656評論 0 0