首頁 > 軟體

Java優秀測試框架TestNG詳解

2022-02-22 13:02:15

我們為什麼需要TestNG?

Java有好幾個測試框架,JUnit是比較常見的一個,Spring系列預設的測試框架就是JUnit。TestNG也是Java的一個測試框架,與JUnit功能類似, 但支援更多的註解與功能。

我們常使用JUnit做單元測試,而在做自動化測試時,更偏向於選擇TestNG。

TestNG搭建

Maven工程中,新增TestNG依賴包即可,可自行選擇版本:

		<dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.1.0</version>
            <scope>test</scope>
        </dependency>

TestNG註解及功能

TestNG的註解與JUnit類似,但會更豐富,更細緻:

註解描述
@Test標記一個類裡所有的public void方法,或某個方法,作為測試案例。
@BeforeSuite對於套件測試,在此套件中的所有測試執行之前執行,僅執行一次。
@AfterSuite對於套件測試,在此套件中的所有測試執行之後執行,僅執行一次。
@BeforeClass在呼叫當前類之前執行,只執行一次。
@AfterClass在呼叫當前類之後執行,只執行一次。
@BeforeTest對於套件測試,在屬於標籤內的所有類的測試方法執行之前執行。
@AfterTest對於套件測試,在屬於標籤內的所有類的測試方法都已執行完之後執行。
@BeforeGroups在呼叫屬於該組的第一個測試方法之前執行。
@AfterGroups在呼叫屬於該組的最後一個測試方法執行之後執行 。
@BeforeMethod註解的方法將每個測試方法之前執行。
@AfterMethod在每個測試方法執行之前都會執行。
@DataProvider標誌著一個方法,提供資料的一個測試方法。註解的方法必須返回一個Object[] [],其中每個物件[]的測試方法的參數列中可以分配。該@Test 方法,希望從這個DataProvider的接收資料,需要使用一個dataProvider名稱等於這個註解的名字。
@Factory作為一個工廠,返回TestNG的測試類的物件將被用於標記的方法。該方法必須返回Object[]。
@Listeners定義一個測試類的監聽器。
@Parameters用於將引數傳遞給@Test方法。

TestNG組態檔

對比JUnit,TestNG最顯眼的區別就是多了一個組態檔。

有了這個組態檔的存在,可以更方便的管理測試案例的執行。

1.新增組態檔

在專案根目錄下,新增testng.xml格式的組態檔,檔名任意,組態檔可以有多個。

maven工程在pom檔案中,指定組態檔路徑後,可以直接執行組態檔:

			<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M4</version>
                <configuration>
                    <suiteXmlFiles>
                        <suiteXmlFile>./testng.xml</suiteXmlFile>
                    </suiteXmlFiles>
                </configuration>
            </plugin>

TestNG設定的內容並不複雜,這裡的設定並不是TestNG啟動的依賴,而是對測試案例的執行方式進行劃分。

2.設定測試套件(suit)

一個組態檔,有且只能有一個測試套件。suit標籤的常見屬性如下,其中name為強制填寫的,會展示在最終的測試報告中。

屬性描述
name套件的名稱,這是一個強制屬性
verbose執行的級別或詳細程度,級別為0-10,其中10最詳細
parallelTestNG是否執行不同的執行緒來執行這個套件,預設為none,其他級別為methods、tests、classes、instances
thread-count如果啟用並行模式(忽略其他方式),則為使用的執行緒數
annotations在測試中使用的註釋型別
time-out在本測試中的所有測試方法上使用的預設超時
preserve-order用於設定測試案例是否按順序執行

3.設定測試案例

按照groups組進行劃分(使用了@Test (groups={“group1”})進行註解的),include標籤標註的組名會被執行,被exclude標註的組則不會被執行:

		<groups>
  			<run>
     			<include name = "includedGroupName" />
     			<exclude name = "excludedGroupName" />
  			</run>
		</groups>

按照包、類、方法三個層級劃分:

包:

		<packages>
            <package name = "com.hhm.demo1.*" />
            <package name = "com.hhm.demo2.*" />
        </packages>

類:

		<classes>
            <class name="com.hhm.demo1.DemoTest1"/>
            <class name="com.hhm.demo1.DemoTest2"/>
		</classes>

方法:

		<classes>
            <class name="com.hhm.demo1.DemoTest1">
                <methods>
                    <include name="testMethodName"></include>
                </methods>
            </class>
        </classes>

完整設定範例:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="First suite" verbose="1" >
    <test name="MyTest" parallel="classes" thread-count="4">
        <packages>
            <package name="com.hhm.demo1.*"></package>
            <package name="com.hhm.demo2.*"></package>
        </packages>
    </test>
</suite>

設定完成後,可以直接執行組態檔,以執行測試案例。也可以通過maven-Lifecycle的test命令執行。

TestNG測試

1.異常測試

預期異常測試通過在@Test註解後加入預期的Exception來進行新增,範例如下:

	@Test(expectedExceptions = ArithmeticException.class)
    public void divisionWithException() {
        int i = 1 / 0;
        System.out.println("After division the value of i is :"+ i);
    }

2.忽略測試

有時候我們寫的用例沒準備好,或者該次測試不想執行此用例,那麼刪掉顯然不明智,那麼就可以通過註解@Test(enabled = false)來將其忽略掉,此用例就不會執行了,如下範例:

public class DemoTest1{
    @Test(enabled=false)
    public void TestNgLearn1() {
        System.out.println("this is TestNG test case1");
    }
    @Test
    public void TestNgLearn2() {
        System.out.println("this is TestNG test case2");
    }
}

3.超時測試

“超時”表示如果單元測試花費的時間超過指定的毫秒數,那麼TestNG將會中止它並將其標記為失敗。此項常用於效能測試。如下為一個範例:

public class DemoTest2{
    @Test(timeOut = 5000) // time in mulliseconds
    public void testThisShouldPass() throws InterruptedException {
        Thread.sleep(4000);
    }
    @Test(timeOut = 1000)
    public void testThisShouldFail() {
        while (true){
            // do nothing
        }
    }
}

4.引數化測試

4.1 使用XML組態檔提供

程式碼如下:

public class DemoTest2 {
    @Parameters({"param1", "param2"})
    public void TestNgLearn1(String param1, int param2) {
        System.out.println("this is TestNG test case1, and param1 is:"+param1+"; param2 is:"+param2);
        Assert.assertFalse(false);
    }
}

XML設定如下:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="First suite" verbose="1" >
    <test name="MyTest">
	    <parameter name="param1" value="1011111" />
	    <parameter name="param2" value="10" />
        <classes>
      		<class name="com.hhm.demo1.DemoTest2"/>
    	</classes>
    </test>
</suite>

4.2 使用@DataProvider傳遞引數

此處需要注意,傳參的型別必須要一致,且帶有@DataProvider註解的函數返回的必然是Object[][],此處需要注意。當提供多組資料時,測試案例則會執行相應次數。

public class DemoTest2 {
    @DataProvider(name = "provideNumbers")
    public Object[][] provideData() {
        return new Object[][] { { 10, 20 }, { 100, 110 }, { 200, 210 } };
    }
    @Test(dataProvider = "provideNumbers")
    public void TestNgLearn1(int param1, int param2) {
        System.out.println("this is TestNG test case1, and param1 is:"+param1+"; param2 is:"+param2);
        Assert.assertFalse(false);
    }
}

5.依賴測試

有時候,我們需要按順序來呼叫測試用例,那麼測試用例之間就存在依賴關係。 TestNG支援測試用例之間的依賴,使用dependOnMethods和dependsOnGroups來實現依賴測試。如下案例,TestNgLearn1()案例失敗時,TestNgLearn2()案例則不會執行:

public class DemoTest1 {
    public void TestNgLearn1() {
        System.out.println("this is TestNG test case1");
        Assert.assertFalse(true);
    }
    @Test(dependsOnMethods= {"TestNgLearn1"})
    public void TestNgLearn2() {
        System.out.println("this is TestNG test case2");
    }
}

TestNG測試報告

使用maven執行完測試用例後,會在 工程根目錄targetsurefire-reports 目錄下,生成測試報告檔案,點選index.html檔案則可以在瀏覽器中檢視。

這裡的報告比較簡單,不夠美觀。我們可以結合Allure外掛,生成更美觀的測試報告。

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容! 


IT145.com E-mail:sddin#qq.com