TestNg框架基礎入門
TestNg框架簡介:
TestNG,即Testing, Next Generation,下一代測試技術,是一套根據JUnit 和NUnit思想而構建的利用註釋來強化測試功能的一個測試框架。TestNG is a testing framework inspired from JUnit and NUnit but introducing some new functionalities that make it more powerful and easier to use。
一.常用註解及解釋
@BeforeSuite: 被此註解的方法將在所有測試運行之前運行該方法。
@AfterSuite:
@BeforeTest: 被此註解的方法,將在測試運行之前運行。
@AfterTest: 被此註解的方法,將在測試運行之後運行。
@BeforeClass: 被此註解的方法,將在當前類的第一個測試方法調用之前運行
@AfterClass: 被此註解的方法,將在當前類的所有測試方法調用之後運行
@BeforeMethod: 被此註解的方法,將在每個測試方法調用之前運行
@AfterMethod: 被此註解的方法,將在每個測試方法調用之後運行。
@Test: 將類或方法標記為測試的一部分,此標記若放在類上,則該類所有公共方法都將被作為測試方法
@DataProvider: 標記一種方法來提供測試方法的數據。 註釋方法必須返回一個Object [] [],其中每個Object []可以被分配給測試方法的參數列表。 要從該DataProvider接收數據的@Test方法需要使用與此註釋名稱相等的dataProvider名稱
@Parameters: 描述如何將參數傳遞給@Test方法
@Factory: 將一個方法標記為工廠,返回TestNG將被用作測試類的對象。 該方法必須返回Object []
@Listeners: 定義測試類上的偵聽器
二.常用斷言方法
2.1.Assert類(硬斷言)
斷言類是Assert.java,裏面有多個靜態方法被稱為硬斷言,硬斷言就是,如果運行到折行斷言失敗,即使後面還有其他代碼行,也不會繼續執行下去。
(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:判斷忽略順序是否相等
2.2.SoftAssert(軟斷言)
SoftAssert的特點
1) 如果一個斷言失敗,會繼續執行這個斷言下的其他語句或者斷言
2) 也就是一個用例有多個斷言,失敗了其中一個,不影響其他斷言的運行
3) 不要忘記調用assertAll()在該用例的最後一個斷言後面
4) 軟斷言的類,叫SoftAssert.java,這個類是需要創建實例對象,才能調用相關實例方法進行軟斷言
具體實例方法此處忽略,請參考硬斷言方法。
三.TestNG預期異常測試
預期異常測試通過在@Test註解後加入預期的Exception來進行添加,範例如下所示:
@Test(expectedExceptions = ArithmeticException.class)
public void divisionWithException() {
int i = 1 / 0;
System.out.println("After division the value of i is :"+ i);
}
測試其他異常一樣的,只需要在@Test註解後加入預期的Exception即可,假如出現了該異常,則會判斷測試通過。
四.TestNG忽略測試
有時候我們寫的用例沒準備好,或者該次測試不想運行此用例,那麽刪掉顯然不明智,那麽就可以通過註解@Test(enabled = false)
來將其忽略掉,此用例就不會運行了,默認是true。
五.TestNG超時測試
“超時”表示如果單元測試花費的時間超過指定的毫秒數,那麽TestNG將會中止它並將其標記為失敗。此項常用於性能測試。如下為一個範例:
@Test(timeOut = 3000) // time in mulliseconds
public void testThisShouldPass() throws InterruptedException {
Thread.sleep(4000);
}
六、分組測試
分組測試即為使用group,如果你使用xml的話就是裏邊的<groups>標簽,如果是直接在class中,是通過@Test(groups="group2")這種方式來分組,而且@BeforeGroup是需要添加group名稱才可以正確掛載到該group下的;
這個group說明可以是在單個的測試方法上,也可以在class上,只要具有同樣的group名稱都會在同一個group中,同時group名稱可以有多個,類似@Test(groups = {"mysql","database"})這種
xml文件配置如下:
<suite name="Suite" parallel="false">
<test name="Test">
<groups>
<incloud name="group1"></incloud>
<incloud name="group2"></incloud>
</groups>
<classes>
<class name="com.demo.test.testng.NewTest"/>
<class name="com.demo.test.testng.TestCase1"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
七.分suite測試
測試套件是用於測試軟件程序的行為或一組行為的測試用例的集合。 在TestNG中,我們無法在測試源代碼中定義一個套件,但它可以由一個XML文件表示,因為套件是執行的功能。 它還允許靈活配置要運行的測試。 套件可以包含一個或多個測試,並由<suite>標記定義。<suite>是testng.xml的根標記。 它描述了一個測試套件,它又由幾個<test>部分組成。
下表列出了<suite>接受的所有定義的合法屬性。
屬性 描述
name 套件的名稱,這是一個強制屬性
verbose 運行的級別或詳細程度,級別為0-10,其中10最詳細
parallel TestNG是否運行不同的線程來運行這個套件,默認為none,其他級別為methods、tests、classes、instances
thread-count 如果啟用並行模式(忽略其他方式),則為使用的線程數
annotations 在測試中使用的註釋類型
time-out 在本測試中的所有測試方法上使用的默認超時
八.依賴測試
有時,我們可能需要以特定順序調用測試用例中的方法,或者可能希望在方法之間共享一些數據和狀態。 TestNG支持這種依賴關系,因為它支持在測試方法之間顯式依賴的聲明。
TestNG允許指定依賴關系:
在@Test註釋中使用屬性dependsOnMethods
在@Test註釋中使用屬性dependsOnGroups
除此之外依賴還分為hard依賴和soft依賴:
hard依賴:默認為此依賴方式,即其所有依賴的methods或者groups必須全部pass,否則被標識依賴的類或者方法將會被略過,在報告中標識為skip,如後面的範例所示,此為默認的依賴方式;
soft依賴:此方式下,其依賴的方法或者組有不是全部pass也不會影響被標識依賴的類或者方法的運行,註意如果使用此方式,則依賴者和被依賴者之間必須不存在成功失敗的因果關系,否則會導致用例失敗。此方法在註解中需要加入alwaysRun=true即可,如@Test(dependsOnMethods= {"TestNgLearn1"}, alwaysRun=true);
在TestNG中,我們使用dependOnMethods和dependsOnGroups來實現依賴測試。 且這兩個都支持正則表達式,如下面所示:
@Test(groups = { "init" })
public void serverStartedOk() {}
@Test(groups = { "init" })
public void initEnvironment() {}
@Test(dependsOnGroups = { "init.*" })
public void method1() {}
九.參數化測試
TestNG中的另一個有趣的功能是參數化測試。 在大多數情況下,您會遇到業務邏輯需要大量測試的場景。 參數化測試允許開發人員使用不同的值一次又一次地運行相同的測試。
TestNG可以通過兩種不同的方式將參數直接傳遞給測試方法:
使用testng.xml
使用數據提供者
下面分別介紹兩種傳參方式:
9.1、使用textng.xml傳送參數
範例代碼如下:
public class TestCase1 {
@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配置:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="false">
<test name="Test">
<parameter name="param1" value="1011111" />
<parameter name="param2" value="10" />
<classes>
<class name="com.demo.test.testng.TestCase1"/>
</classes>
</test>
</suite>
9.2、使用@DataProvider
傳遞參數
此處需要註意,傳參的類型必須要一致,且帶有@DataProvider
註解的函數返回的必然是Object[][]
,此處需要註意。
示例代碼如下:
public class TestCase1 {
@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);
}
十、XML配置文件說明
如下分別講解各個標簽:
10.1、suite標簽
testNG.xml文件的最外層標簽即suite,即測試套件,其下可以有多個<test>和<groups>,其有幾個可以添加的屬性在第十節的分suite測試中有做說明,這裏做下詳細說明:
(1)、name屬性
此屬性屬於必須要有的,值可以自行設定,此名字會在testNG的報告中看到;
(2)、verbose屬性
此屬性為指定testNG報告的詳細程度,從0開始到10,其中10為最詳細,默認生成的xml此屬性值為1;
(3)、parallel屬性
此屬性是指代運行方式,默認為none,即串行運行方式;並行執行方法包括如下幾種,下面做分別說明:
a.methods:方法層級,若為此值,則該suite下所有的測試方法都將進行多線程,即測試用例級別的多線程。如果用例之間有依賴,則執行順序會按照設定的依賴來運行;
<suite name="My suite" parallel="methods" thread-count="5">
b.tests:TestNG將在同一線程中運行相同的<Test>標簽中的所有方法,每個<test>標簽都將處於一個單獨的線程中,這允許您將不是線程安全的所有類分組在同一個<test>中,並保證它們都將在同一個線程中運行,同時利用TestNG使用盡可能多的線程運行測試。
<suite name="My suite" parallel="tests" thread-count="5">
c.classes:類級別並發,即TestNG會將該suite下每個class都將在單獨的線程中運行,同一個class下的所有用例都將在同一個線程中運行;
<suite name="My suite" parallel="classes" thread-count="5">
d.instances:實例級別,即TestNG將在同一線程中運行同一實例中的所有方法,兩個不同實例上的兩個方法將在不同的線程中運行。
<suite name="My suite" parallel="instances" thread-count="5">
(4)、thread-count屬性
此屬性用於指定線程數,按照需要輸入,需要parallel參數非none時才可以添加;
(5)、annotations屬性
此項為註解的級別,為methods級別和class級別,一般不用設置;
(6)、time-out屬性
此屬性用於指定超時時間,該suite下所有的用例的超時時間;
(7)、group-by-instances屬性
此項用於那些有依賴的方法,且被依賴的對象有多個重載對象,因為如果是依賴方法,且該方法有多個重載方法,則默認是會將所有重載方法都跑完再運行被依賴方法,但有時候我們不想這樣,則將此項設置為true即可;
(8)、preserve-order屬性
值可輸入true或者false,如果為true,則用例執行會按照在xml中的順序執行,否則會亂序執行,不添加此屬性的話默認是按順序執行的;
10.2、test標簽
此標簽無特別意義,其下可以包括多個標簽,如groups、classes等,如下介紹下幾種書寫方式:
選擇一個包中的全部測試腳本(包含子包)
<test name = "allTestsInAPackage" >
<packages>
<package name = "whole.path.to.package.* />
</packages>
</test>
選擇一個類中的全部測試腳本
<test name = "allTestsInAClass" >
<classes>
<class name="whole.path.to.package.className />
</classes>
</test>
選擇一個類中的部分測試腳本
<test name = "aFewTestsFromAClass" >
<classes>
<class name="whole.path.to.package.className >
<methods>
<include name = "firstMethod" />
<include name = "secondMethod" />
<include name = "thirdMethod" />
</methods>
</class>
</classes>
</test>
選擇一個包中的某些組
<test name = "includedGroupsInAPackage" >
<groups>
<run>
<include name = "includedGroup" />
</run>
</groups>
<packages>
<package name = "whole.path.to.package.* />
</packages>
</test>
排除一個包中的某些組
<test name = "excludedGroupsInAPackage" >
<groups>
<run>
<exclude name = "excludedGroup" />
</run>
</groups>
<packages>
<package name = "whole.path.to.package.* />
</packages>
</test>
其可以附帶的屬性有如下幾種,下面對各個屬性做單獨說明:
(1)、name屬性
此屬性屬於必須要有的,值可以自行設定,此名字會在testNG的報告中看到;
(2)、verbose屬性
此屬性為指定testNG報告的詳細程度,從0開始到10,其中10為最詳細,默認生成的xml此屬性值為1
(3)、threadPoolSize屬性
該屬性指定此test的線程池大小,為數字;
@Test(threadPoolSize = 3, invocationCount = 10, timeOut = 10000)
public void testServer() {
}
(4)、invocationCount屬性
該屬性指定此test的運行次數,為數字,範例如上面的代碼所示;
(5)、time-out屬性
此屬性用於指定超時時間,該suite下所有的用例的超時時間,範例如上面的代碼所示;
(6)、group-by-instances屬性
此項用於那些有依賴的方法,且被依賴的對象有多個重載對象,因為如果是依賴方法,且該方法有多個重載方法,則默認是會將所有重載方法都跑完再運行被依賴方法,但有時候我們不想這樣,則將此項設置為true即可;
<suite name="Factory" group-by-instances="true">
(7)、preserve-order屬性
值可輸入true或者false,如果為true,則用例執行會按照在xml中的順序執行,否則會亂序執行,不添加此屬性的話默認是按順序執行的;
10.3、group標簽
此標簽必然是在<test>標簽下的,用於標識那些組會被用於測試或者被排除在測試之外,其同級必然要包含一個<classes>標簽或者<pakages>標簽,用於指定groups來自於哪些包或者類;
如下即為包含一個group,排除一個group的例子:
<groups>
<run>
<include name = "includedGroupName" />
<exclude name = "excludedGroupName" />
</run>
</groups>
高級應用:
<test name="Regression1">
<groups>
<define name="functest">
<include name="windows"/>
<include name="linux"/>
</define>
<define name="all">
<include name="functest"/>
<include name="checkintest"/>
</define>
<run>
<include name="all"/>
</run>
</groups>
<classes>
<class name="test.sample.Test1"/>
</classes>
</test>
10.4、其他
其他的話就是測試腳本的選擇了,有三種方式:
選擇一個包
<packages>
<package name = "packageName" />
</packages>
選擇一個類
<classes>
<class name = "className" />
</classes>
選擇一個方法
<classes>
<class name = "className" />
<methods>
<include name = "methodName" />
</methods>
</class>
</classes>
這裏也支持正則表達式,例如:
<test name="Test1">
<classes>
<class name="example1.Test1">
<methods>
<include name=".*enabledTestMethod.*"/>
<exclude name=".*brokenTestMethod.*"/>
</methods>
</class>
</classes>
</test>
TestNg框架基礎入門