一、前言
以前有用過TestNG,後來不知爲何學了一陣子就沒下文了,至此就一直用Python的框架做自動化。下半年換了新工作,面試了測試開發的崗位,發現測開大部分是用java,所以最近又學起了java基礎(雖然大學的時候學過,但是全都還給老師了,哈哈哈)。邊學java的過程也邊學java的測試框架,貌似TestNG是用的比較多的,所以就開始了學習之旅,雖然可以運用到實踐,但是學的還是比較蹩腳,就不再囉嗦了,進入正文吧。
參考了:https://blog.csdn.net/df0128/article/details/83243822
二、TestNG介紹
TestNG是Java中的一個測試框架, 類似於JUnit 和NUnit, 功能都差不多, 只是功能更加強大,使用也更方便。
Java中已經有一個JUnit的測試框架了,TestNG比JUnit功能強大的多, 測試人員一般用TestNG來寫自動化測試,開發人員一般用JUnit寫單元測試。
官方網站: http://testng.org/doc/index.html
三、TestNG安裝(基於IDEA)
1、一般來說IDEA是自帶TestNG框架的:File > Settings > Plugins,搜索TestNG安裝即可。
2、IDEA的結構:project - module - package - class
注:用實際例子解釋一下IDEA的結構:project(購物網站),module(購物車或者訂單模塊),package(模塊下的細分,包名一般用公司域名倒過來寫),class(類)
3、具體的新建項目操作步驟可自行百度
四、TestNG基本運用和運行
1、一個簡單的例子如下:
package com.tech.suc; import org.junit.Assert; import org.junit.Test; public class Case { @Test public void test(){ System.out.println("this is testng case"); Assert.assertTrue(true); } }
2、直接用腳本方式運行:右鍵Run
3、xml方式運行:新建testng.xml,右鍵Run
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" > <suite name="Suite1" verbose="1" > <test name="Nopackage" > <classes> <class name="com.tech.suc.Case" /> </classes> </test> </suite>
五、TestNG註解說明
1、TestNG註解
TestNG支持多種註解,可以進行各種組合,如下進行簡單的說明,列表中的@Factory、@Linsteners這兩個是不常用的;
註解 | 描述 |
@BeforeSuite | 在該套件的所有測試都運行在註釋的方法之前,僅運行一次 |
@AfterSuite | 在該套件的所有測試都運行在註釋方法之後,僅運行一次 |
@BeforeClass | 在調用當前類的第一個測試方法之前運行,註釋方法僅運行一次 |
@AfterClass | 在調用當前類的第一個測試方法之後運行,註釋方法僅運行一次 |
@BeforeTest | 註釋的方法將在屬於test標籤內的類的所有測試方法運行之前運行 |
@AfterTest | 註釋的方法將在屬於test標籤內的類的所有測試方法運行之後運行 |
@BeforeGroups | 配置方法將在之前運行組列表。 此方法保證在調用屬於這些組中的任何一個的第一個測試方法之前不久運行 |
@AfterGroups | 此配置方法將在之後運行組列表。該方法保證在調用屬於任何這些組的最後一個測試方法之後不久運行 |
@BeforeMethod | 註釋方法將在每個測試方法之前運行 |
@AfterMethod | 註釋方法將在每個測試方法之後運行 |
以上註解的屬性 | |
@DataProvider | 標記一種方法來提供測試方法的數據。 註釋方法必須返回一個Object [] [],其中每個Object []可以被分配給測試方法的參數列表。 要從該DataProvider接收數據的@Test方法需要使用與此註釋名稱相等的dataProvider名稱 |
@Factory | 將一個方法標記爲工廠,返回TestNG將被用作測試類的對象。 該方法必須返回Object [] |
@Listeners | 定義測試類上的偵聽器 |
@Parameters | 描述如何將參數傳遞給@Test方法 |
@Test |
將類或方法標記爲測試的一部分,此標記若放在類上,則該類所有公共方法都將被作爲測試方法 |
2、常用註解簡單例子
package com.tech.design; import org.testng.annotations.Test; public class Case { @Test(enabled = false) public void Test1(){ System.out.println("忽略測試,此測試用例不會運行"); } //“超時”表示如果單元測試花費的時間超過指定的毫秒數, // 那麼TestNG將會中止它並將其標記爲失敗。此項常用於性能測試 @Test(timeOut = 5000) public void Test2(){ System.out.println("超時測試"); } @Test(description = "Test3用例描述信息") public void Test3(){ System.out.println("描述,用於展示在測試報告中"); } //依賴測試用例 @Test(dependsOnMethods = {"Test2"}) public void Test4(){ System.out.println("依賴測試,執行該用例前會先執行Test1用例"); } //依賴測試用例分組 @Test(dependsOnGroups = {"group1"}) public void Test5(){ System.out.println("依賴測試,執行該用例前會先執行Test1用例"); } @Test(groups = "group1") public void Test6(){ System.out.println("分組測試1,Test6"); } @Test(groups = "group1") public void Test7(){ System.out.println("分組測試1,Test7"); } @Test(groups = "group2") public void Test8(){ System.out.println("分組測試group2,在xml執行時可以體現"); } }
3、其他說明
1)依賴測試
TestNG允許指定依賴關係:
- 在@Test註釋中使用屬性dependsOnMethods
- 在@Test註釋中使用屬性dependsOnGroups
除此之外依賴還分爲hard依賴和soft依賴:
- hard依賴:默認爲此依賴方式,即其所有依賴的methods或者groups必須全部pass,否則被標識依賴的類或者方法將會被略過,在報告中標識爲skip,如後面的範例所示,此爲默認的依賴方式;
- 以下實例的被依賴方法Test4的結果爲fail:因爲所依賴的method(Test1)不執行,即fail,所以會導致被依賴(Test4)fail。若Test1是true,則Test4執行成功。
-
package com.tech.design; import org.testng.annotations.Test; public class Case { @Test(enabled = false) public void Test1(){ System.out.println("忽略測試,此測試用例不會運行"); } //依賴測試用例 @Test(dependsOnMethods = {"Test1"}) public void Test4(){ System.out.println("依賴測試,執行該用例前會先執行Test1用例"); } }
- soft依賴:此方式下,其依賴的方法或者組有不是全部pass也不會影響被標識依賴的類或者方法的運行,注意如果使用此方式,則依賴者和被依賴者之間必須不存在成功失敗的因果關係,否則會導致用例失敗。此方法在註解中需要加入alwaysRun=true即可,如@Test(dependsOnMethods= {"TestNgLearn1"}, alwaysRun=true);