Java優(yōu)秀測試框架TestNG詳解
我們?yōu)槭裁葱枰猅estNG?
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 | 標(biāo)記一個類里所有的public void方法,或某個方法,作為測試案例。 |
@BeforeSuite | 對于套件測試,在此套件中的所有測試執(zhí)行之前運行,僅運行一次。 |
@AfterSuite | 對于套件測試,在此套件中的所有測試執(zhí)行之后運行,僅運行一次。 |
@BeforeClass | 在調(diào)用當(dāng)前類之前運行,只運行一次。 |
@AfterClass | 在調(diào)用當(dāng)前類之后運行,只運行一次。 |
@BeforeTest | 對于套件測試,在屬于標(biāo)簽內(nèi)的所有類的測試方法執(zhí)行之前運行。 |
@AfterTest | 對于套件測試,在屬于標(biāo)簽內(nèi)的所有類的測試方法都已執(zhí)行完之后運行。 |
@BeforeGroups | 在調(diào)用屬于該組的第一個測試方法之前運行。 |
@AfterGroups | 在調(diào)用屬于該組的最后一個測試方法執(zhí)行之后運行 。 |
@BeforeMethod | 注解的方法將每個測試方法之前運行。 |
@AfterMethod | 在每個測試方法執(zhí)行之前都會運行。 |
@DataProvider | 標(biāo)志著一個方法,提供數(shù)據(jù)的一個測試方法。注解的方法必須返回一個Object[] [],其中每個對象[]的測試方法的參數(shù)列表中可以分配。該@Test 方法,希望從這個DataProvider的接收數(shù)據(jù),需要使用一個dataProvider名稱等于這個注解的名字。 |
@Factory | 作為一個工廠,返回TestNG的測試類的對象將被用于標(biāo)記的方法。該方法必須返回Object[]。 |
@Listeners | 定義一個測試類的監(jiān)聽器。 |
@Parameters | 用于將參數(shù)傳遞給@Test方法。 |
TestNG配置文件
對比JUnit,TestNG最顯眼的區(qū)別就是多了一個配置文件。
有了這個配置文件的存在,可以更方便的管理測試案例的執(zhí)行。
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配置的內(nèi)容并不復(fù)雜,這里的配置并不是TestNG啟動的依賴,而是對測試案例的執(zhí)行方式進行劃分。
2.配置測試套件(suit)
一個配置文件,有且只能有一個測試套件。suit標(biāo)簽的常見屬性如下,其中name為強制填寫的,會展示在最終的測試報告中。
屬性 | 描述 |
---|---|
name | 套件的名稱,這是一個強制屬性 |
verbose | 運行的級別或詳細程度,級別為0-10,其中10最詳細 |
parallel | TestNG是否運行不同的線程來運行這個套件,默認為none,其他級別為methods、tests、classes、instances |
thread-count | 如果啟用并行模式(忽略其他方式),則為使用的線程數(shù) |
annotations | 在測試中使用的注釋類型 |
time-out | 在本測試中的所有測試方法上使用的默認超時 |
preserve-order | 用于配置測試案例是否按順序執(zhí)行 |
3.配置測試案例
按照groups組進行劃分(使用了@Test (groups={“group1”})進行注解的),include標(biāo)簽標(biāo)注的組名會被執(zhí)行,被exclude標(biāo)注的組則不會被執(zhí)行:
<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>
配置完成后,可以直接運行配置文件,以執(zhí)行測試案例。也可以通過maven-Lifecycle的test命令執(zhí)行。
TestNG測試
1.異常測試
預(yù)期異常測試通過在@Test注解后加入預(yù)期的Exception來進行添加,示例如下:
@Test(expectedExceptions = ArithmeticException.class) public void divisionWithException() { int i = 1 / 0; System.out.println("After division the value of i is :"+ i); }
2.忽略測試
有時候我們寫的用例沒準(zhǔn)備好,或者該次測試不想運行此用例,那么刪掉顯然不明智,那么就可以通過注解@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.超時測試
“超時”表示如果單元測試花費的時間超過指定的毫秒數(shù),那么TestNG將會中止它并將其標(biāo)記為失敗。此項常用于性能測試。如下為一個范例:
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.參數(shù)化測試
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傳遞參數(shù)
此處需要注意,傳參的類型必須要一致,且?guī)в蠤DataProvider注解的函數(shù)返回的必然是Object[][],此處需要注意。當(dāng)提供多組數(shù)據(jù)時,測試案例則會執(zhí)行相應(yīng)次數(shù)。
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.依賴測試
有時候,我們需要按順序來調(diào)用測試用例,那么測試用例之間就存在依賴關(guān)系。 TestNG支持測試用例之間的依賴,使用dependOnMethods和dependsOnGroups來實現(xiàn)依賴測試。如下案例,TestNgLearn1()案例失敗時,TestNgLearn2()案例則不會執(zhí)行:
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執(zhí)行完測試用例后,會在 工程根目錄\target\surefire-reports 目錄下,生成測試報告文件,點擊index.html文件則可以在瀏覽器中查看。
這里的報告比較簡單,不夠美觀。我們可以結(jié)合Allure插件,生成更美觀的測試報告。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
使用Easyexcel實現(xiàn)不同場景的數(shù)據(jù)導(dǎo)出功能
這篇文章主要為大家詳細介紹了如何在不同場景下使用Easyexcel實現(xiàn)數(shù)據(jù)導(dǎo)出功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03springcloud 中 zuul 修改請求參數(shù)信息的方法
這篇文章主要介紹了springcloud 中 zuul 修改請求參數(shù)信息的方法,需要的朋友可以參考下2018-02-02Spring Data Jpa 復(fù)合主鍵的實現(xiàn)
這篇文章主要介紹了Spring Data Jpa 復(fù)合主鍵的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04