天天看點

TestNG使用總結

TestNG簡介:

TestNG是一個測試架構,其靈感來自JUnit和NUnit,但同時引入了一些新的功能,使其功能更強大,使用更友善。

TestNG相較于Junit的優點:

·可指定執行順序, dependsOnMethods 屬性來應對測試的依賴性問題。

·參數化測試,TestNG 提供了開箱即用的類似特性。通過在 TestNG 的 XML 配置檔案中放入參數化資料,就可以對不同的資料集重用同一個測試用例,甚至有可能會得到不同的結果。支援@DataProvider 注釋可以友善地把複雜參數類型映射到某個測試方法。

·支援分組測試

·支援多線程測試

官網位址:http://testng.org/doc/index.html

引入依賴:

<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8</version>
</dependency>
           

TestNG用法簡介:

注解 描述
@BeforeSuite 注解的方法将隻運作一次,所有測試運作前運作。
@AfterSuite 注解的方法将隻運作一次,,所有測試運作後運作。
@BeforeClass 注解的方法将隻運作一次,被注釋的方法将在目前類的第一個測試方法調用前運作。
@AfterClass 注解的方法将隻運作一次,被注釋的方法将在目前類的最後一個個測試方法調用後運作。
@BeforeTest 被注釋的方法将在所有測試方法運作前運作
@AfterTest 被注釋的方法将在所有測試方法運作後運作
@BeforeGroups 組的清單,這種配置方法将之前運作。此方法是保證在運作屬于任何這些組第一個測試方法,該方法被調用。
@AfterGroups 組的名單,這種配置方法後,将運作。此方法是保證運作後不久,最後的測試方法,該方法屬于任何這些組被調用。
@BeforeMethod 注解的方法将每個測試方法之前運作。
@AfterMethod 被注釋的方法将被運作後,每個測試方法。
@DataProvider 标志着一個方法,提供資料的一個測試方法。注解的方法必須傳回一個Object[] [],其中每個對象[]的測試方法的參數清單中可以配置設定。該@Test 方法,希望從這個DataProvider的接收資料,需要使用一個dataProvider名稱等于這個注解的名字。
@Factory 作為一個工廠,傳回TestNG的測試類的對象将被用于标記的方法。該方法必須傳回Object[]。
@Listeners 定義一個測試類的監聽器。
@Parameters 介紹如何将參數傳遞給@Test方法。
@Test 标記一個類或方法作為測試的一部分。

生命周期:

@BeforeSuite->@BeforeTest->@BeforeClass->{@BeforeMethod->@Test->@AfterMethod}->@AfterClass->@AfterTest->@AfterSuite

分組測試

相比junit的TestCase/TestSuite,TestNG有suite/test/test method三個級别,即将test/test method明确區分開了。

* suite由xml檔案描述。它包含一個或多個測試并被定義為标簽

* test由描述并包含一個或者多個TestNG類

* TestNG類是包含至少一個TestNG annotation的java類,由标簽描述并包含一個或多個測試方法

測試類:

public class QueryTest {
    @Test(groups = {"functest", "checkintest"})
    public void testMethod1() {
        System.out.println("groups = { functest, checkintest }");
    }

    @Test(groups = {"functest", "checkintest"})
    public void testMethod2() {
        System.out.println("groups = { functest, checkintest }");
    }

    @Test(groups = {"functest"})
    public void testMethod3() {
        System.out.println("groups = { functest }");
    }

    @Test(groups = {"checkintest"})
    public void testMethod4() {
        System.out.println("groups = { checkintest }");
    }
}
           

testng.xml檔案:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="framework_testng">
    <test verbose="2" name="TestGroups">
        <groups>
            <run>
                <include name="functest" />
                <exclude name="checkintest" />
            </run>
        </groups>

        <classes>
            <class name="QueryTest" />
        </classes>
    </test>
</suite>  
           

意思就是執行QueryTest類中group帶functest,排除checkintest的方法;

依賴執行

用例間依賴關系,按序執行:

public class DependsTest {

@Test
public void setupEnv(){
System.out.println("this is setup Env");
}
//setupEnv()方法須在testMessage()方法前執行
@Test(dependsOnMethods = {"setupEnv"})
public void testMessage(){
System.out.println("this is test message");
}
}
           

參數化測試

TestNG提供了2種傳遞參數的方式。

第一種: testng.xml 方式使代碼和測試資料分離,友善維護,适用于一個用例,需要多個相同參數(值不同)來驗證的情況。

第二種:@DataProvider能夠提供比較複雜的參數。

這裡介紹下第一種,如下例:@Parameters({ “key” }) 會去testng.xml裡取到這個key對應的value,放到傳參secondName中。

public class TestngParameters {  

    // @Parameters注解内對應的參數名稱和配置檔案中的key必須是相同  
    @Parameters({ "key" })  
    @Test  
    public void testSingleString(String secondName) {  
        System.err.println("Invoked testString " + secondName);  
        assert "Cedric".equals(secondName);  
    } 
           

對應的testng.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
        <parameter name="key" value="Tank" />
        <parameter name="key" value="Xiao" />
    <test name="test12">
        <classes>
            <class name="ClassName" />
        </classes>
    </test
</suite>
           

異常處理

TestNG通過@Test(expectedExceptions) 來判斷期待的異常, 并且判斷Error Message

e.g:@Test(expectedExceptions =IllegalArgumentException.class, expectedExceptionsMessageRegExp=”NullPoint”)

忽略測試:

@Test(enable = false), 來禁用此測試用例

多線程運作:

invocationCount—-表示執行的次數

threadPoolSize—–表示線程池的内線程的個數

timeOut——-逾時時間-毫秒

TestNG常用斷言:

導入Assert包:

import static org.testng.Assert.*;
           

(1) assertTrue:判斷是否為True。

(2) assertFalse:判斷是否為false。

(3) assertSame:判斷引用位址是否相同。

(4) assertNotSame:判斷引用位址是否不相同。

(5) assertNull:判斷是否為null。

(6) assertNotNull:判斷是否不為null。

(7) assertEquals:判斷是否相等,Object類型的對象需要實作haseCode及equals方法。

(8) assertNotEquals:判斷是否不相等。

(9) assertEqualsNoOrder:判斷忽略順序是否相等。