簡介
在設計接口測試框架或者UI自動化框架的時候,大概率都會用到testng這個框架,本篇主要介紹testng這個框架的使用。
官方文檔:http://testng.org/doc/index.html
testng的特點
- 註解功能
- TestNG使用Java和麪向對象的功能
- 支持綜合類測試(例如,默認情況下,沒有必要創建一個新的測試每個測試方法的類的實例)
- 獨立的編譯時間測試代碼運行時配置/數據信息
- 靈活的運行時配置
- 主要介紹“測試組”。當編譯測試,只要問TestNG運行所有的“前端”的測試,或“快”,“慢”,“數據庫”等
- 支持依賴測試方法,並行測試,負載測試,局部故障
- 靈活的插件API
- 支持多線程測試
testng環境配置
- 驗證Java安裝在你的機器上
- 設置JAVA環境
- 通過maven下載TestNG
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
使用步驟
- 編寫測試業務邏輯,在代碼中插入TestNG annotations
- 在配置文件testng.xml或build.xml中配置測試信息
- 運行TestNG
註解的優點
- TestNG的標識的方法關心尋找註解。因此,方法名並不限於任何模式或格式
- 我們可以通過額外的參數註解
- 註釋是強類型的,所以編譯器將標記任何錯誤
- 測試類不再需要任何東西(如測試案例,在JUnit3)擴展
註解的運行順序
- @BeforeSuite: 被註釋的方法將在所有測試運行前運行
- @AfterSuite: 被註釋的方法將在所有測試運行後運行
- @BeforeTest: 被註釋的方法將在測試運行前運行
- @AfterTest: 被註釋的方法將在測試運行後運行
- @BeforeGroups: 被配置的方法將在列表中的gourp前運行。這個方法保證在第一個屬於這些組的測試方法調用前立即執行
- @AfterGroups: 被配置的方法將在列表中的gourp後運行。這個方法保證在最後一個屬於這些組的測試方法調用後立即執行
- @BeforeClass: 被註釋的方法將在當前類的第一個測試方法調用前運行
- @AfterClass: 被註釋的方法將在當前類的所有測試方法調用後運行
- @BeforeMethod:被註釋的方法將在每一個測試方法調用前運行
- @AfterMethod: 被註釋的方法將在每一個測試方法調用後運行
TestNG一個方法的生命週期
- @BeforeSuite(執行一次)
- @BeforeClass(執行一次)
- @BeforeMethod(N個Test 方法執行N次)
- @Test Test方法(此註解可能在類上表示多個,在方法表示一個)
- @AfterMethod(N個Test 方法執行N次)
- @AfterClass(執行一次)
- @AfterSuite(執行一次)
@Test註解裏的參數
- dependsOnMethods、dependsOnGroups:依賴測試,一個test依賴於另一個test的執行結果
- groups:組測試,一個test屬於哪一個組,可以跑一個特定組的所有test
- expectedExceptions:異常測試
- dataProvider:參數化測試,將參數傳入該test
- enabled:忽略測試,不執行該test
- timeOut、threadPoolSize、invocationCount、successPercentage:併發測試,設置併發測試的各種參數
- alwaysRun: 如果爲true的話,不管怎樣都會運行
依賴測試
有時候需要在特定的順序下調用測試案例,或分享一些數據和方法之間的狀態,就可以使用dependsOnMethods或dependsOnGroups申明。被註解的方法只有在被依賴的方法執行成功後執行。
以上兩段代碼,分別是這兩個參數的運用,只有被依賴的方法執行成功,依賴的方法纔會執行。
組測試
在TestNG中組測試是一個新的創新功能,它不存在於JUnit框架,它允許調度到適當的部分方法和瓶坯複雜的測試方法分組。你不僅可以聲明屬於羣體的那些方法,但你也可以指定一組包含其他組。然後,TestNG可調用和要求包括一組特定的羣體(或正則表達式),而排除另一個集合。這給了你最大的靈活性,如何分區測試,如果想運行兩套不同的測試背靠背,不要求重新編譯任何東西。
以上分別是定義的test方法和對應的testng.xml中的分組設定。
運行方法分別爲
- 命令行
java org.testng.TestNG -groups checkintest -excludegroups functest com.testng.example.GroupTestExample
- Ant
<testng groups="checkintest" excludegroups="functest">
<classfileset>
<include name=“com/testng/example/GroupTestExample” />
</classfileset>
</testng>
- 利用java API
TestNG tng = new TestNG();
tng.setGroups("checkintest");
tng.setExcludeGroups(“functest")
- 運行配置的TestNG.xml
異常測試
TestNG跟蹤異常處理代碼提供了一個選項。可以測試是否需要代碼拋出異常或不拋出。 @Test註釋expectedExceptions 參數一起使用。
參數化測試
在TestNG的另一個有趣的功能是參數測試。在大多數情況下,你會遇到這樣一個場景,業務邏輯需要一個巨大的不同數量的測試。參數測試,允許開發人員運行同樣的測試,一遍又一遍使用不同的值。TestNG讓你直接傳遞參數測試方法兩種不同的方式:使用testng.xml、數據提供程序。
1、@Parameter
TestNG支持@Parameter傳參方式的類型如下
- String
- int/Integer
- boolean/Boolean
- byte/Byte
- char/Character
- double/Double
- float/Float
- long/Long
- short/Short
2、@DataProvider - 只提供了一個字符串屬性:名稱,供測試方法作爲傳遞參數的annotation使用
- 兩種DataProvider,一種是返回一個二維數組對象,如上面的例子;另外一種DataProvider是返回一個Iterator
- DataProvider可以向測試方法傳遞任意類型任意數目的參數
- 利用DataProvider提供不同的參數集合對一個測試方法進行多次調用
忽略測試
有時,我們的代碼是沒有準備好,如果測試用例寫入到測試方法代碼將無法運行,在這種情況下,@Test(enabled = false)有助於禁用此測試案例。 測試方法是標註了@Test(enabled = false),那麼並不是已經準備好測試的測試用例是繞過的。
併發測試
TestNG可以以多線程的模式運行所有的test,這樣可以獲得最大的運行速度,最大限度的節約執行時間。當然,併發運行也是有代價的,就是需要我們的代碼是線程安全的
tesng.xml介紹
Testng.xml是以xml記錄所有測試的文件。它描述了測試套件的運行時定義,也是testng中運行測試的最大工作單元。雖然沒有testng.xml文件,測試也很容易被執行。但是隨着測試代碼的增長,testng.xml提供了方便用來存放所有運行時的配置,如設置有關類,測試,方法,參數,分組的包含與排除等。
Testng.xml的主要結構:根標籤是,標籤包含一個或多個標籤,標籤包含一個或多個標籤,標籤包含一個或多個標籤
- Suite:由一個XML文件表示,可以包含一個或者多個Test,suite可以通過標籤來運行其他testng的xml文件
- Test:表示一個測試,可以包含一個或者多個TestNG類
- TestNG類:就是一個簡單的Java類,至少包含一個TestNG annotation
- Method:一個普通的Java方法,其前由@Test標記
- Groups:TestNG可以將不同的Method分類到不同的Groups中,也可以將Class分類到不同的Groups中