Testng與Junit區(qū)別【轉載】

轉自 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發(fā)展而來的祈餐,至少借鑒了很多Junit的思想(實際上TestNG的作者本身就是Junit的小組成員之一)稍坯。

我們從最表面的現(xiàn)象來看看吧

TestNG沒有繼承任何類沛申,甚至接口!浓恳!

JDK 5 Annotations

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

  1.     靈活的test configuration
    

先看一下Junit的執(zhí)行順序
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,基本上一個項目寫一個配置文件就可以了茬祷,當然如果你的項目足夠大,可能需要幾個配置文件并蝗。測試是按照從大到小的順序進行的祭犯,先執(zhí)行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;

從字面意思可以看出方法的執(zhí)行順序起惕,唯一的疑惑是執(zhí)行的次數(shù),官方的文檔的解釋是相當讓人疑惑的问词,好在我們可以自己測試嘀粱,beforeTestMethod是當類中任何方法調用都要執(zhí)行的辰狡,beforeTest和beforeTestClass在一個Test中是只執(zhí)行一次的(沒試過把2個相同的類寫到一個Test里面)宛篇,而beforeSuite在一個配置文件中只執(zhí)行一次叫倍。上面都沒有考慮分組的情況,分組會更加的復雜嘿般,似乎靈活過頭了炉奴,但是考慮到項目的復雜性,每個測試方法的初始化都可能不同赛糟,現(xiàn)在我們做的項目要求每天要將單元測試寫進daily build的build文件里面自動執(zhí)行砸逊,似乎只有用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>

…………

   執(zhí)行C1        T1

只選group2
…………………

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

…………

執(zhí)行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.     參數(shù)
    

Junit是不帶任何參數(shù)的荧呐,不論是測試方法還是配置方法纸镊,而TestNG都是可以添加參數(shù)的,有2種方法峰搪。

(1) 使用Parameter參數(shù)

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

參數(shù)的值放到配置文件中

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

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

(2) DataProvider

這是從4.0以后增加的功能济欢,看看怎么實現(xiàn)。

// 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);
}

執(zhí)行的結果

Cedric 36
Anne 37

DataProvider返回的是個2維數(shù)組的對象茫叭,什么數(shù)據(jù)都可以提供了吧揍愁,而且可以讓你的測試方法執(zhí)行多次杀饵。而且最重要的是和測試方法寫在一起,所見即所得朽缎。

  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>
      //執(zhí)行testng的任務

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

簡單的不能在簡單了赌躺,你只要告訴ant來調用,然后告訴ant配置文件在哪里是钥,剩下的事都交給testng自己的配置文件去做就行了悄泥,然后ant以后都不用修改了肤粱。不建議將任務的細節(jié)寫在ant里面领曼,首先功能不如testng自己的配置文件強大庶骄,而且ant需要維護。

下面基本上是TestNG才有的特點了单刁,和Junit沒有什么關系,但為了延續(xù)檐春,還是用了上面的題目喇聊。
7 .依賴關系
先給個例子

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

public void method1() {}

在這個例子中誓篱,method1()必須在serverStartedOk()執(zhí)行后才能執(zhí)行凯楔,而且serverStartedOk()不能fail摆屯,否則method1()會被skip掉

基本上類似于ant的依賴關系虐骑,也很容易理解,只是分為強依靠和弱依靠糊饱,區(qū)別是弱依靠只管執(zhí)行的順序颠黎,強依靠除了順序,還要正確夭坪,否則后面的不執(zhí)行室梅,上面的例子是強依靠,下面是弱依靠,加上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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末逮栅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窗宇,更是在濱河造成了極大的恐慌措伐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件军俊,死亡現(xiàn)場離奇詭異侥加,居然都是意外死亡,警方通過查閱死者的電腦和手機蝇完,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門官硝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人短蜕,你說我怎么就攤上這事岖研∷镌” “怎么了镶奉?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵币砂,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么盆色? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任宣旱,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘燎字。我一直安慰自己洒放,他們只是感情好妖异,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布矩乐。 她就那樣靜靜地躺著,像睡著了一般欧漱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天李请,我揣著相機與錄音,去河邊找鬼绅络。 笑死纪蜒,一個胖子當著我的面吹牛灭袁,可吹牛的內容都是我干的。 我是一名探鬼主播软瞎,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼只锭,長吁一口氣:“原來是場噩夢啊……” “哼蜻展!你這毒婦竟也來了片挂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎件余,沒想到半個月后旬渠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體损谦,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡岳颇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掂摔。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖熏纯,靈堂內的尸體忽然破棺而出柔吼,到底是詐尸還是另有隱情桩匪,我是刑警寧澤傻昙,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布闺骚,位于F島的核電站,受9級特大地震影響妆档,放射性物質發(fā)生泄漏僻爽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一贾惦、第九天 我趴在偏房一處隱蔽的房頂上張望胸梆。 院中可真熱鬧,春花似錦须板、人聲如沸碰镜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绪颖。三九已至,卻和暖如春甜奄,著一層夾襖步出監(jiān)牢的瞬間柠横,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工课兄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牍氛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓烟阐,卻偏偏與公主長得像搬俊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蜒茄,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容

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