接口自動化測試框架TestNg

什麼是TestNG

TestNG,即Testing Next Generation,它派生自JUnit和NUnit,除了繼承了兩者的優勢之外,又額外的發展出了一些新的功能,在參數化測試,依賴測試和套件測試(分組概念)方面更加突出。 TestNG用於高級測試和複雜集成測試。

爲什麼用TestNG

TestNG有以下優點:

  • 生成美觀易讀的測試報告

  • 註解 使測試變得更加方便

  • 可以更輕鬆地對測試用例進行分組和指定執行順序

  • 支持併發測試

  • 生成日誌

  • 數據驅動測試

  • 主流工具的成熟集成

分組測試

相比junit的TestCase/TestSuite,TestNG有suite/test/test method三個級別,即將test/test method明確區分開了。

  • suite由xml文件描述。它包含一個或多個測試並被定義爲標籤
  • test由描述幷包含一個或者多個TestNG類
  • TestNG類是包含至少一個TestNG annotation的java類,由標籤描述幷包含一個或多個測試方法

測試類:

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

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

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

testng.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<suite name="TestNG">
    <test name="Test1">
        <groups>
            <run>
                <include name="checkintest"/>
            </run>
        </groups>
        <classes>
            <class name="com.example.testng_demo.Testng"/>
        </classes>
    </test>
</suite>

意思就是執行Testng類中groups包含checkintest的方法,testMethod3這個方法的groups不含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");
    }
}

說到按序執行,我們也可以把一些初始化/ 收尾工作的測試方法用@BeforeSuite/@AfterSuite,@BeforeGroups/@AfterGroups, @BeforeTest/@AfterTest等標記。

參數化測試

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

第一種: testng.xml 方式使代碼和測試數據分離,方便維護,適用於一個用例,需要多個相同參數(值不同)來驗證的情況。
第二種:@DataProvider能夠提供比較複雜的參數。

如下例:

第一種,@Parameters({ “merchantNo” }) 會去testng.xml裏取到這個merchantNo對應的value,放到傳參merchant中。

public class TestParameter {
    // @Parameters註解內對應的參數名稱和配置文件中的merchantNo必須是相同
    // 如果在配置文件中找不到參數名稱爲“merchantNo”的參數,則測試方法將接收@Optional註解中指定的默認值:“chen001”
    @Parameters({ "merchantNo" })
    @Test
    public void testString(@Optional("chen001")String merchant) {
        System.out.println("Invoked testString " + merchant);
        assert "chen001".equals(merchant);
    }
} 

對應的testng.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<suite name="TestNg">
    <parameter name="merchantNo"  value="chen001"/>
    <test name="TestParameter">
        <classes>
            <class name="com.example.testng_demo.TestParameter"/>
        </classes>
    </test>
</suite>

第二種,註解@DataProvider在參數化測試中起到重要的作用,該註解下的函數返回數據類型有兩種,一種返回類型是Iterator<Object[]>,還一種返回類型是 Object[][],看例子如何實現:

@DataProvider函數,需要定義屬性name

	@DataProvider(name = "testcase")
    public Iterator <Object[]> createData2() {
        List <Object[]> datas = new ArrayList <Object[]>();
        datas.add(new Object[]{"payment"});
        datas.add(new Object[]{"refund"});
        datas.add(new Object[]{"check"});
        return datas.iterator();
    }
 	@DataProvider(name = "testcase2")
    public Object[][] createData1() {
        return new Object[][] {
                { "Cedric", new Integer(36) },
                { "Anne", new Integer(37)},
        };
    }

@Test測試用例,屬性dataProvider需要指定對應的@DataProvider名稱

    @Test(dataProvider = "testcase")
    public void verifyData2(String type) {
        System.out.println(type);
    }
	@Test(dataProvider = "testcase2")
    public void verifyData1(String n1, Integer n2) {
        System.out.println(n1 + " " + n2);
    }

輸出:

Cedric : 36
Anne : 37
payment
refund
check

提供數據方式

在這裏插入圖片描述

異常處理

TestNG通過 @Test(expectedExceptions) 來判斷期待的異常, 也可以判斷Error Message

@Test(expectedExceptions = IllegalArgumentException.class,expectedExceptionsMessageRegExp = "非法參數")
public void testException(){
    throw new IllegalArgumentException("非法參數");
}

多線程運行

// 共3個線程調用了10次該方法
@Test(threadPoolSize = 3, invocationCount = 10,timeOut = 3000)
public void testThread(){
    System.out.println(Thread.currentThread().getId());
}
invocationCount——-表示執行的次數 
threadPoolSize——-表示線程池內線程的個數 
timeOut——-超時時間-毫秒

測試報告及自定義日誌

在這裏插入圖片描述

TestNG中的測試用例編寫過程

在TestNG中編寫測試非常簡單,基本上包括以下步驟:

  • 第1步 - 編寫測試的業務邏輯
  • 第2步 - 在代碼中插入TestNG註解
  • 第3步 - 在testng.xml文件中添加有關測試的信息(例如,類名,方法名,組名等)
  • 第4步 - 運行TestNG

TestNG 常用註解

  • @BeforeSuite:在此套件中的所有測試運行之前,將運行帶註釋的方法。

  • @AfterSuite:在此套件中的所有測試運行後,將運行帶註釋的方法。

  • @BeforeTest:在運行屬於標記內的類的任何測試方法之前,將運行帶註釋的方法。

  • @AfterTest:在標記內的類的所有測試方法都運行之後,將運行帶註釋的方法。

  • @BeforeGroups:此配置方法之前將運行的組列表。保證在調用屬於任何這些組的第一個測試方法之前不久運行此方法。

  • @AfterGroups:此配置方法將在之後運行的組列表。保證在調用屬於任何這些組的最後一個測試方法後不久運行此方法。

  • @BeforeClass:在調用當前類中的第一個測試方法之前,將運行帶註釋的方法。

  • @AfterClass:在運行當前類中的所有測試方法之後,將運行帶註釋的方法。

  • @BeforeMethod:帶註釋的方法將在每個測試方法之前運行。

  • @AfterMethod:帶註釋的方法將在每個測試方法之後運行。

  • @Test:帶註釋的方法是測試用例的一部分。

生命週期:

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

TestNG常用斷言:

導入Assert包:
import static org.testng.Assert.*;

  • assertTrue:判斷是否爲True。

  • assertFalse:判斷是否爲false。

  • assertSame:判斷引用地址是否相同。

  • assertNotSame:判斷引用地址是否不相同。

  • assertNull:判斷是否爲null。

  • assertNotNull:判斷是否不爲null。

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

  • assertNotEquals:判斷是否不相等。

  • assertEqualsNoOrder:判斷忽略順序是否相等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章