TestNG與Junit的比較

轉(zhuǎn)自 http://www.blogjava.net/fanscial/archive/2005/12/14/23780.html

成都創(chuàng)新互聯(lián)主要從事做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)雨花,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108

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

一個(gè)典型的Junit的測(cè)試類

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

}

}

對(duì)應(yīng)的TestNG的測(cè)試類,我們寫最簡(jiǎn)單的情況。

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

    }

}

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

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

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

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

l         JDK 5 Annotations

這2者是息息相關(guān)的,為什么我們不用繼承任何類,因?yàn)樾畔⒍荚谧⑨尷锩?,這樣會(huì)帶來很多好處(絕不僅僅是命名的方便)。

 

2.         靈活的test configuration

先看一下Junit的執(zhí)行順序

Setup( )   test1( )    tearDown( )      Setup( )     test2( )      tearDown( )…………

下面是TestNG的

 TestNG 與 Junit的比較

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

3.         TestNG 的靈魂

配置文件(testng.xml)

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

<!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>

上面包含了配置文件的基本的主干,一個(gè)配置文件只有一個(gè)Suite,基本上一個(gè)項(xiàng)目寫一個(gè)配置文件就可以了,當(dāng)然如果你的項(xiàng)目足夠大,可能需要幾個(gè)配置文件。測(cè)試是按照從大到小的順序進(jìn)行的,先執(zhí)行suite,test,class,其中的group和class是平級(jí)的,在講group的時(shí)候再詳細(xì)的解釋。有了這個(gè)文件,我們就可以很清楚的理解@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ù),官方的文檔的解釋是相當(dāng)讓人疑惑的,好在我們可以自己測(cè)試,beforeTestMethod是當(dāng)類中任何方法調(diào)用都要執(zhí)行的,beforeTest和beforeTestClass在一個(gè)Test中是只執(zhí)行一次的(沒試過把2個(gè)相同的類寫到一個(gè)Test里面),而beforeSuite在一個(gè)配置文件中只執(zhí)行一次。上面都沒有考慮分組的情況,分組會(huì)更加的復(fù)雜,似乎靈活過頭了,但是考慮到項(xiàng)目的復(fù)雜性,每個(gè)測(cè)試方法的初始化都可能不同,現(xiàn)在我們做的項(xiàng)目要求每天要將單元測(cè)試寫進(jìn)daily build的build文件里面自動(dòng)執(zhí)行,似乎只有用TestNG這樣靈活的配置才能達(dá)到。

 

4.         分組

將一個(gè)測(cè)試方法或者配置方法分組是很容易的。

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

@Test(groups=”group1”)

只要象上面寫就可以了,名字隨便取,而且不需要預(yù)先定義。

我們?cè)谝粋€(gè)類做2個(gè)組,看看效果

@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個(gè)都選

…………………

       <groups>

<run name="group1">

       <run name="group2">

       </run>

       </groups>

…………

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

然而實(shí)際上是  C1        C2        T1        C1        C2        T2 (B)

要想達(dá)到(A)的效果,只能把2個(gè)group分開了放在不同的Test里面,其實(shí)只要知道一點(diǎn),TestNG是先找Class,然后才去找Group的。

4.         參數(shù)

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

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

        @Parameters({ "first-name" })
        @Test
        public void testSingleString(String firstName) {
        System.out.println("Invoked testString " + firstName);
        assert "Cedric".equals(firstName);
        }
        參數(shù)的值放到配置文件中
        <suite name="My suite">
        <parameter name="first-name"  value="Cedric"/>
        <test name="Simple example">

   這種方法偶爾用之還可以,但是很遺憾的是第一只能傳String(可能可以其他的基本數(shù)據(jù)類型??但至少不能傳復(fù)雜對(duì)象),第二數(shù)據(jù)寫在配置文件中,不能所見即所得。

但是下面的方法真的給我們驚喜。

(2)       DataProvider

  這是從4.0以后增加的功能,看看怎么實(shí)現(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í)行的結(jié)果

Cedric 36

Anne 37

 

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

5.         Ant的集成和Daily Build

TestNG對(duì)Ant提供了很好的支持,這是我寫得測(cè)試用的Ant腳本

<project default="testng">

       <property file="build.properties" />

       <path id="cpath">

              <fileset dir="lib">

                     <include name="*.jar"/>

              </fileset>

       </path>

//定義testng的任務(wù)

       <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的任務(wù)

       <target name="testng" depends="compile">

              <testng classpath="test/classes">

                     <xmlfileset dir="${configure.dir}" includes="testing.xml" />

              </testng>

       </target>

</project>

簡(jiǎn)單的不能在簡(jiǎn)單了,你只要告訴ant來調(diào)用,然后告訴ant配置文件在哪里,剩下的事都交給testng自己的配置文件去做就行了,然后ant以后都不用修改了。不建議將任務(wù)的細(xì)節(jié)寫在ant里面,首先功能不如testng自己的配置文件強(qiáng)大,而且ant需要維護(hù)。

下面基本上是TestNG才有的特點(diǎn)了,和Junit沒有什么關(guān)系,但為了延續(xù),還是用了上面的題目。
7 .依賴關(guān)系
先給個(gè)例子

@Test

public void serverStartedOk() {}

 

@Test(dependsOnMethods = { "serverStartedOk" })

public void method1() {}

 

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

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

@Test

public void serverStartedOk() {}

 

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

public void method1() {}

如果有興趣,可以看看下面的文章,里面有有趣的爭(zhēng)論

http://beust.com/weblog/archives/000171.html

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

本文題目:TestNG與Junit的比較
網(wǎng)站地址:http://www.muchs.cn/article44/ghjgee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、自適應(yīng)網(wǎng)站、品牌網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、建站公司、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)