Java優(yōu)秀測(cè)試框架TestNG詳解
我們?yōu)槭裁葱枰猅estNG?
Java有好幾個(gè)測(cè)試框架,JUnit是比較常見的一個(gè),Spring系列默認(rèn)的測(cè)試框架就是JUnit。TestNG也是Java的一個(gè)測(cè)試框架,與JUnit功能類似, 但支持更多的注解與功能。
我們常使用JUnit做單元測(cè)試,而在做自動(dòng)化測(cè)試時(shí),更偏向于選擇TestNG。
TestNG搭建
Maven工程中,添加TestNG依賴包即可,可自行選擇版本:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.1.0</version>
<scope>test</scope>
</dependency>
TestNG注解及功能
TestNG的注解與JUnit類似,但會(huì)更豐富,更細(xì)致:
| 注解 | 描述 |
|---|---|
| @Test | 標(biāo)記一個(gè)類里所有的public void方法,或某個(gè)方法,作為測(cè)試案例。 |
| @BeforeSuite | 對(duì)于套件測(cè)試,在此套件中的所有測(cè)試執(zhí)行之前運(yùn)行,僅運(yùn)行一次。 |
| @AfterSuite | 對(duì)于套件測(cè)試,在此套件中的所有測(cè)試執(zhí)行之后運(yùn)行,僅運(yùn)行一次。 |
| @BeforeClass | 在調(diào)用當(dāng)前類之前運(yùn)行,只運(yùn)行一次。 |
| @AfterClass | 在調(diào)用當(dāng)前類之后運(yùn)行,只運(yùn)行一次。 |
| @BeforeTest | 對(duì)于套件測(cè)試,在屬于標(biāo)簽內(nèi)的所有類的測(cè)試方法執(zhí)行之前運(yùn)行。 |
| @AfterTest | 對(duì)于套件測(cè)試,在屬于標(biāo)簽內(nèi)的所有類的測(cè)試方法都已執(zhí)行完之后運(yùn)行。 |
| @BeforeGroups | 在調(diào)用屬于該組的第一個(gè)測(cè)試方法之前運(yùn)行。 |
| @AfterGroups | 在調(diào)用屬于該組的最后一個(gè)測(cè)試方法執(zhí)行之后運(yùn)行 。 |
| @BeforeMethod | 注解的方法將每個(gè)測(cè)試方法之前運(yùn)行。 |
| @AfterMethod | 在每個(gè)測(cè)試方法執(zhí)行之前都會(huì)運(yùn)行。 |
| @DataProvider | 標(biāo)志著一個(gè)方法,提供數(shù)據(jù)的一個(gè)測(cè)試方法。注解的方法必須返回一個(gè)Object[] [],其中每個(gè)對(duì)象[]的測(cè)試方法的參數(shù)列表中可以分配。該@Test 方法,希望從這個(gè)DataProvider的接收數(shù)據(jù),需要使用一個(gè)dataProvider名稱等于這個(gè)注解的名字。 |
| @Factory | 作為一個(gè)工廠,返回TestNG的測(cè)試類的對(duì)象將被用于標(biāo)記的方法。該方法必須返回Object[]。 |
| @Listeners | 定義一個(gè)測(cè)試類的監(jiān)聽器。 |
| @Parameters | 用于將參數(shù)傳遞給@Test方法。 |
TestNG配置文件
對(duì)比JUnit,TestNG最顯眼的區(qū)別就是多了一個(gè)配置文件。
有了這個(gè)配置文件的存在,可以更方便的管理測(cè)試案例的執(zhí)行。
1.新增配置文件
在項(xiàng)目根目錄下,新增testng.xml格式的配置文件,文件名任意,配置文件可以有多個(gè)。
maven工程在pom文件中,指定配置文件路徑后,可以直接運(yùn)行配置文件:
<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啟動(dòng)的依賴,而是對(duì)測(cè)試案例的執(zhí)行方式進(jìn)行劃分。
2.配置測(cè)試套件(suit)
一個(gè)配置文件,有且只能有一個(gè)測(cè)試套件。suit標(biāo)簽的常見屬性如下,其中name為強(qiáng)制填寫的,會(huì)展示在最終的測(cè)試報(bào)告中。
| 屬性 | 描述 |
|---|---|
| name | 套件的名稱,這是一個(gè)強(qiáng)制屬性 |
| verbose | 運(yùn)行的級(jí)別或詳細(xì)程度,級(jí)別為0-10,其中10最詳細(xì) |
| parallel | TestNG是否運(yùn)行不同的線程來運(yùn)行這個(gè)套件,默認(rèn)為none,其他級(jí)別為methods、tests、classes、instances |
| thread-count | 如果啟用并行模式(忽略其他方式),則為使用的線程數(shù) |
| annotations | 在測(cè)試中使用的注釋類型 |
| time-out | 在本測(cè)試中的所有測(cè)試方法上使用的默認(rèn)超時(shí) |
| preserve-order | 用于配置測(cè)試案例是否按順序執(zhí)行 |
3.配置測(cè)試案例
按照groups組進(jìn)行劃分(使用了@Test (groups={“group1”})進(jìn)行注解的),include標(biāo)簽標(biāo)注的組名會(huì)被執(zhí)行,被exclude標(biāo)注的組則不會(huì)被執(zhí)行:
<groups>
<run>
<include name = "includedGroupName" />
<exclude name = "excludedGroupName" />
</run>
</groups>
按照包、類、方法三個(gè)層級(jí)劃分:
包:
<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>
配置完成后,可以直接運(yùn)行配置文件,以執(zhí)行測(cè)試案例。也可以通過maven-Lifecycle的test命令執(zhí)行。

TestNG測(cè)試
1.異常測(cè)試
預(yù)期異常測(cè)試通過在@Test注解后加入預(yù)期的Exception來進(jìn)行添加,示例如下:
@Test(expectedExceptions = ArithmeticException.class)
public void divisionWithException() {
int i = 1 / 0;
System.out.println("After division the value of i is :"+ i);
}
2.忽略測(cè)試
有時(shí)候我們寫的用例沒準(zhǔn)備好,或者該次測(cè)試不想運(yùn)行此用例,那么刪掉顯然不明智,那么就可以通過注解@Test(enabled = false)來將其忽略掉,此用例就不會(huì)運(yùn)行了,如下范例:
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í)測(cè)試
“超時(shí)”表示如果單元測(cè)試花費(fèi)的時(shí)間超過指定的毫秒數(shù),那么TestNG將會(huì)中止它并將其標(biāo)記為失敗。此項(xiàng)常用于性能測(cè)試。如下為一個(gè)范例:
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ù)化測(cè)試
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ù)時(shí),測(cè)試案例則會(huì)執(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.依賴測(cè)試
有時(shí)候,我們需要按順序來調(diào)用測(cè)試用例,那么測(cè)試用例之間就存在依賴關(guān)系。 TestNG支持測(cè)試用例之間的依賴,使用dependOnMethods和dependsOnGroups來實(shí)現(xiàn)依賴測(cè)試。如下案例,TestNgLearn1()案例失敗時(shí),TestNgLearn2()案例則不會(huì)執(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測(cè)試報(bào)告
使用maven執(zhí)行完測(cè)試用例后,會(huì)在 工程根目錄\target\surefire-reports 目錄下,生成測(cè)試報(bào)告文件,點(diǎn)擊index.html文件則可以在瀏覽器中查看。
這里的報(bào)告比較簡(jiǎn)單,不夠美觀。我們可以結(jié)合Allure插件,生成更美觀的測(cè)試報(bào)告。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
IDEA 自帶的數(shù)據(jù)庫工具真的很牛(收藏版)
這篇文章主要介紹了IDEA 自帶的數(shù)據(jù)庫工具真的很牛(收藏版),本文以 IntelliJ IDEA/ Mac 版本作為演示,其他版本的應(yīng)該也差距不大,需要的朋友可以參考下2021-04-04
SpringBoot之@ConditionalOnProperty注解使用方法
在平時(shí)業(yè)務(wù)中,我們需要在配置文件中配置某個(gè)屬性來決定是否需要將某些類進(jìn)行注入,讓Spring進(jìn)行管理,而@ConditionalOnProperty能夠?qū)崿F(xiàn)該功能,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-05-05
Elasticsearch term 查詢之精確值搜索功能實(shí)現(xiàn)
term查詢是Elasticsearch中用于精確值搜索的一種基本方式,通過了解 term 查詢的工作原理和使用方法,你可以更好地利用 Elasticsearch 進(jìn)行結(jié)構(gòu)化數(shù)據(jù)的搜索和分析,本文將詳細(xì)介紹 term 查詢的工作原理、使用場(chǎng)景以及如何在 Elasticsearch 中應(yīng)用它,感興趣的朋友一起看看吧2024-06-06
Java Fluent Mybatis 項(xiàng)目工程化與常規(guī)操作詳解流程篇 上
Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國內(nèi)又以Mybatis用的多,基于mybatis上的增強(qiáng)框架,又有mybatis plus和TK mybatis等。今天我們介紹一個(gè)新的mybatis增強(qiáng)框架 fluent mybatis2021-10-10
Maven實(shí)戰(zhàn)之搭建Maven私服和鏡像的方法(圖文)
本篇文章主要介紹了搭建Maven私服和鏡像的方法(圖文),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
SpringBoot項(xiàng)目中如何實(shí)現(xiàn)MySQL讀寫分離詳解
在高并發(fā)下需要對(duì)應(yīng)用進(jìn)行讀寫分離,配置多數(shù)據(jù)源,即寫操作走主庫,讀操作則走從庫,主從數(shù)據(jù)庫負(fù)責(zé)各自的讀和寫,緩解了鎖的爭(zhēng)用,提高了讀取性能,這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目中如何實(shí)現(xiàn)MySQL讀寫分離的相關(guān)資料,需要的朋友可以參考下2022-07-07
Java實(shí)現(xiàn)矩陣乘法以及優(yōu)化的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)矩陣乘法以及優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

