TestNG的簡單使用
TestNG(Test Next Generation)是一個測試框架,其靈感來自JUnit和NUnit,但同時引入了一些新的功能,使其功能更強大,使用更方便。
- TestNG是一個設計用來簡化廣泛的測試需求的測試框架,涵蓋單元測試到集成測試
- 支持依賴測試方法,並行測試,異常測試、參數化測試、時限測試、分組測試等測試方法
- 基於Annotation機制,使測試方法更為靈活配置
- 引入xml配置文件,從而使軟件測試不僅僅是硬編碼到程序中,做到更為靈活
- 支持多線程測試
編寫TestNG測試基本上包括以下步驟:
- 編寫測試的業務邏輯代碼,並在相應代碼中插入TestNG的annotation。
- 將測試信息配置到testng.xml文件中。
- 運行TestNG,TestNG默認情況下,會生產兩種類型的測試報告HTML的和XML的。 測試報告位於 "test-output" 目錄下。
TestNG的實現——Annotation
常用Annotation
- @BeforeSuite/@AfterSuite 在某個測試套件開始之前/在某個套件所有測試方法執行之后
- @BeforeTest/@AfterTest 在某個測試開始之前/在某個測試所有測試方法執行之后
- @BeforeClass/@AfterClass 在某個測試類開始之前/在某個類的所有測試方法執行之后
- @BeforeMethod/@AfterMethod 在某個測試方法之前/在某個測試方法執行之后
- @BeforeGroup/@AfterGroup 在某個組的所有測試方法之前/在某個組的所有測試方法執行之后
- @DataProvider 標志一個方法,用來提供測試數據,標注的方法能夠返回一個Object[] []或者Iterator<Object[]>對象。
- @Listeners 定義一個測試類的監聽器。
- @Parameters 設置參數,用以傳遞給測試方法。
Annotation帶來的優勢
- before方法和after方法 帶來了足夠豐富的測試生命周期控制
- dependsOnGroups/dependsOnMethods 提供了依賴檢查機制,並可以嚴格控制執行順序
- DataProvider 使得對同一個方法的測試覆蓋變的非常輕松,非常適合進行邊界測試,只要給出多種測試數據就可以針對一個測試方法進行覆蓋
- expectedExceptions 使得異常測試變的非常輕松
- invocationCount/threadPoolSize 可以簡單地設置並行測試的線程數,並開啟多線程測試
- timeOut 用來設定測試方法超時時間,從而對程序的效率和運行時間有了更為直觀的控制
TestNG的靈魂——testng.xml
說明:
- 標簽 suite 代表一個測試套件。它可以包含一個或多個測試
- 標簽 test 代表一個測試,並可以包含一個或多個TestNG測試類
- class的標簽代表一個TestNG的類是一個Java類,它包含至少一個TestNG的注解,也可以包含一個或多個測試方法
- package制定測試的包名,自動檢索當前包中包含TestNG Annotation的類和方法
- groups用來表明測試用例的分組,有利於針對一類的測試用例進行專門的測試
- 一個配置文件中只有一個suite,基本上一個項目寫一個配置文件就可以了,當然如果你的項目足夠大,可能需要幾個配置文件。
suite屬性說明:
- @name: suite的名稱,必須參數
- @junit:是否以Junit模式運行,可選值(true | false),默認"false"
- @verbose:命令行信息打印等級,不會影響測試報告輸出內容;可選值(1|2|3|4|5)
- @parallel:是否多線程並發運行測試;可選值(false | methods | tests | classes | instances),默認 "false"
- @thread-count:當為並發執行時的線程池數量,默認為"5"
- @configfailurepolicy:一旦Before/After Class/Methods這些方法失敗后,是繼續執行測試還是跳過測試;可選值 (skip | continue),默認"skip"
- @time-out:為具體執行單元設定一個超時時間,具體參照parallel的執行單元設置;單位為毫秒
- @skipfailedinvocationcounts:是否跳過失敗的調用,可選值(true | false),默認"false"
- @data-provider-thread-count:並發執行時data-provider的線程池數量,默認為"10"
- @preserve-order:順序執行開關,可選值(true | false),默認為"true"
test屬性說明:
-
@name:test的名字,必選參數;測試報告中會有體現
-
@junit:是否以Junit模式運行,可選值(true | false),默認"false"
-
@verbose:命令行信息打印等級,不會影響測試報告輸出內容;可選值(1|2|3|4|...|10)
-
@parallel:是否多線程並發運行測試;可選值(false | methods | tests | classes | instances),默認 "false"
-
@thread-count:當為並發執行時的線程池數量,默認為"5"
-
@time-out:為具體執行單元設定一個超時時間,具體參照parallel的執行單元設置;單位為毫秒
-
@enabled:設置當前test是否生效,可選值(true | false),默認"true"
-
@skipfailedinvocationcounts:是否跳過失敗的調用,可選值(true | false),默認"false"
-
@preserve-order:順序執行開關,可選值(true | false) 默認為"true"
-
@group-by-instances:是否按實例分組,可選值(true | false) 默認為"false"
備注:(By default, dependent methods are grouped by class. For example, if method b() depends on method a(), TestNG will not run b() until all the instances have invoked their a() method. This behavior might not be desirable in certain scenarios, such as for example testing a sign in and sign out of a web browser for various countries.)
-
@allow-return-values:是否允許返回函數值,可選值(true | false),默認"false"
備注:(Test methods are annotated with @Test. Methods annotated with @Test that happen to return a value will be ignored, unless you set allow-return-values to true in your testng.xml。)
常用測試方法
異常測試 忽略測試 時限測試
異常測試
可以檢測某一方法檢測到某一異常時是否能按預期地拋出
忽略測試
TestNG是通過直接在方法上加標注的方式來進行測試,而這里也可以設置某個測試方法不工作。可以通過如下方式:
時限測試
可以設置一個特定時長的限制(以毫秒ms為單位),一旦測試的內容運行超過了該 時間長度,那么將會終止,同時標記為failed
TestNG特有測試機制
組測試 參數化測試 並行測試 依賴測試
組測試
通過定義分組,來執行特定一組測試方法,從而提高用戶測試的靈活性,同時在測試配置文件中也可以通過include和exclude屬性的配置,來控制測試用例的執行
參數化測試
Data Provider方法可以返回如下兩種類型中的一種:
1.含有多個對象的數組 (Object[][]),其中第一個下標指明了測試方法要調用的次數,第二個下標則完全與測試方法中的參數類型和個數相匹配。
2.另外一個是迭代器 Iterator<Object[]>。二者的區別是迭代器允許你延遲創建自己的測試數據。TestNG會調用迭代器,之后測試方法會一個接一個的調用由迭代器返回的值。在你需要傳遞很多參數組給測試組的時候,這樣你無須提前創建一堆值。
通過@Parameters傳遞參數。
並行測試
TestNG允許我們以並行(多線程)的方式來執行測試。這就意味着基於TestNG測試組件的配置,多個線程可以被同時啟動然后分別執行各自的測試方法。
並行(多線程)執行測試可以給用戶帶來很多好處,主要包括以下兩點:
1)減少了執行時間:並行測試也就意味着多個測試可以在同一時間被同時執行,從而減少了整體測試所花費的時間。 2)允許多個線程並行地測試同一個測試組件:有了這個特性,我們就能夠寫出相應的測試用例來驗證應用程序中包含多線程部分的代碼的正確性。
依賴測試
Testng提供了兩種依賴實現:強制依賴和順序依賴
- 強制依賴:如果被依賴的某一個方法發生了異常,那么之后的方法都不會被執行(默認)
- 順序依賴:無論被依賴的方法是否出現異常,后續的方法都會被執行,通過alwaysRun=“true”來配置
TestNG的應用場景
- TestNG參數化批量測試
例如我們車型庫會有很多車型id,車系id等數據,我們可以把對應的數據隨機組合到excel或者文本中,然后代碼中通過@DataProvider來進行測試。
舉例隨便在excel中構造點數據, 然后輸出如下:
2, 多線程測試
我們服務端接口響應速度一般都要求在100ms以內,那么我們怎樣能確定我們對服務端的接口能夠達到這個要求呢? 我們可以通過testNG的多線程以及指定timeOut來測試。
生成報告
在代碼目錄下的test-output文件夾,點開index.htm即可查看測試報告:
參考附錄
[TestNG教程]:http://www.yiibai.com/testng/
[TestNG testing framework]:https://github.com/cbeust/testng
[TestNG Documentation]:http://testng.org/doc/documentation-main.html
[junit-4-vs-testng-comparison]:http://www.mkyong.com/unittest/junit-4-vs-testng-comparison/