Java自動化測試框架-11 - TestNG之annotation與併發測試篇 (詳細教程)
1、簡介
TestNG中用到的annotation的快速預覽及其屬性。
2、TestNG基本註解(註釋)
註解 | 描述 |
@BeforeSuite | 註解的方法只執行一次,在當前suite所有測試執行之前執行 |
@AfterSuite | 註解的方法只執行一次,在當前suite所有測試執行之後執行 |
@BeforeClass | 註解的方法只執行一次,在當前類中所有方法呼叫之前執行 |
@AfterClass | 註解的方法只執行一次,在當前類中所有方法呼叫之後執行 |
@BeforeTest | 只執行一次,所有的測試方法執行之前執行 |
@AfterTest | 只執行一次,所有的測試方法執行之後執行 |
@BeforeGroups | 組的列表,這種配置方法將之前執行。此方法是保證在執行屬於任何這些組第一個測試方法,該方法被呼叫。 |
@AfterGroups | 組的名單,這種配置方法後執行。此方法是保證執行後不久,最後的測試方法,該方法屬於任何這些組被呼叫。 |
@BeforeMethod | 在每一個測試方法(@test)執行之前執行,例:執行完測試用例後要重置資料才能執行第二條用例時,可用之種方式。 |
@AfterMethod | 在每一個測試方法(@test)執行之後執行 |
@DataProvider | 標誌著一個方法,提供資料的一個測試方法。註解的方法必須返回一個Object[] [],其中每個物件[]的測試方法的引數列表中可以分配。 該@Test 方法,希望從這個DataProvider的接收資料,需要使用一個dataProvider名稱等於這個註解的名字。 |
@Factory | 作為一個工廠,返回TestNG的測試類的物件將被用於標記的方法。該方法必須返回Object[]。 |
@Listeners | 定義一個測試類的監聽器 |
@Parameters | 介紹如何將引數傳遞給@Test方法。 |
@Test | 標記一個類或方法作為測試的一部分。 |
3、使用註釋/註解的好處
以下是使用註釋/註解的一些好處:
-
TestNG通過查詢註釋/註解來識別它感興趣的方法。 因此,方法名稱不限於任何模式或格式。
-
可以將其他引數傳遞給註釋。
-
註釋是強型別的,所以編譯器會馬上標記任何錯誤。
-
測試類不再需要擴充套件任何東西(如TestCase,對於JUnit3)。
4、 Concurrenttesting(註解方式):
@Test註解上可通過配置threadPoolSize來實現併發,threadPoolSize和invocationCount是結合使用的,當invocationCount=1的時候,threadPoolSize沒有意義。invocationCount表示方法被呼叫的次數,如果不配置threadPoolSize,該方法會被順序執行5次,如果配置threaPoolSize=4,下圖所示的方法會一次以4個執行緒併發執行,縮短執行時間。下面的例子是輸出程序ID,threadPoolSize用來指明執行緒池的大小,也就是併發的執行緒數目是多少
5次呼叫,有3個執行緒可呼叫
1、新建com.course.testng.multiThread包,包裡新建MuitiThreadOnAnnotion類,如下
2、參考程式碼
package com.course.testng.multiThread; import org.testng.annotations.Test; /** * @author 北京-巨集哥 * * Java自動化測試框架-11 - TestNG之annotation與併發測試篇 * * 2019年11月11日 */ //多執行緒測試,沒有關聯的用例可以使用多執行緒減少執行時間 public class MuitiThreadOnAnnotion { @Test(invocationCount = 5,threadPoolSize = 3) public void test() { System.out.println(1); System.out.printf("Thrad Id : %s%n",Thread.currentThread().getId()); } }
3、控制檯頁面輸出
4、若改成5次呼叫,有5個執行緒可呼叫
5、testng.xml配置檔案
TestNG可以以多執行緒的模式執行所有的test,這樣可以獲得最大的執行速度,最大限度的節約執行時間。當然,併發執行也是有代價的,就是需要我們的程式碼是執行緒安全的。
併發執行測試的話,需要我們指定執行的配置檔案,一個示例如下:
<suite name="My suite" parallel="methods" thread-count="4">
說明:在當前測試規劃的執行過程中,為每個測試方法的執行使用單獨的執行緒,最多併發4個執行緒。
<suite name="My suite" parallel="tests" thread-count="4">
說明:在當前測試規劃的執行過程中,為每個測試用例的執行使用單獨的執行緒(該測試用例中的測試方法共享一個執行緒),最多併發4個執行緒。
<suite name="My suite" parallel="classes" thread-count="4">
說明:在當前測試規劃的執行過程中,為每個測試類的執行使用單獨的執行緒(該測試類中的測試方法共享一個執行緒),最多併發4個執行緒。
<suite name="My suite" parallel="instances" thread-count="4">
說明:在當前測試規劃的執行過程中,為每個測試類例項的執行始終使用唯一的執行緒(該測試例項中的測試方法共享一個執行緒),最多併發4個執行緒。
注意:這裡的parallel預設值為"none"。曾經的"true", "false"已經過時了,不建議使用。
1.Parallel=”methods”的意思是指TestNG會將method作為併發的元子單位,即每個method執行在自己的thread中。如果parallel=”tests”,則指會將test 作為併發的元子單位
2.Thread-count=”2”是指,執行的時候,併發度為2,同時會有兩個執行緒在執行。
1、新建一個測試類,例如:Test1
2、參考程式碼
package com.course.testng.multiThread; import org.testng.annotations.Test; /** * @author 北京-巨集哥 * * Java自動化測試框架-11 - TestNG之annotation與併發測試篇 * * 2019年11月12日 */ public class Test1 { @Test(groups = { "t8"}) public void aThreadPool() { System.out.println("#ThreadA: " +Thread.currentThread().getId()); } @Test(groups = { "t8"}) public void bThreadPool() { System.out.println("#ThreadB: " +Thread.currentThread().getId()); } @Test(groups = { "t8"}) public void cThreadPool() { System.out.println("#ThreadC: " +Thread.currentThread().getId()); } }
3、testng.xml檔案
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"> <test name="Test" parallel="methods" thread-count="2"> <classes> <class name="com.course.testng.multiThread.Test1"/> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
4、控制檯輸出結果:
5、修改testng.xml檔案如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"> <test name="Test" parallel="tests" thread-count="2"> <classes> <class name="com.course.testng.multiThread.Test1"/> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
6、控制檯頁面輸出(因為aThreadPool(),bThreadPool(),cThreadPool()都在一個test下面)
6、小結
好了,今天關於TestNG之annotation與併發測試篇 ,就分享到這