日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

*TestNG

發布時間:2024/1/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 *TestNG 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 一、Eclipse 中安裝 、使用TestNG
      • 1、在線安裝
      • 2、離線安裝
      • 3、安裝TestNG之后,導入jar
      • 4、創建TestNG單元測試項目
    • 二、TestNG 注釋
      • @Test 注解
      • @Parameters 注解:用于為測試方法傳遞參數
      • @DataProvider 注解
      • @Factory 注解
      • @Listeners 注解
    • 三、testng.xml 文件
    • 四、運行測試用例、查看測試結果
      • TestNG 的運行測試用例有3種方法:
        • (1)方法一:通過class來執行:
        • (1)方法二
        • (2)方法三
    • 五、TestNG 測試技巧
      • 1、依賴性測試
      • 2、忽略測試
      • 3、參數化測試


一、Eclipse 中安裝 、使用TestNG

1、在線安裝

  • 首先打開 Eclipse,點擊菜單欄:Help ->Install New Software;
  • 點擊“Add…”按鈕,彈出 Add Repository 窗口,輸入 name 和 location ;
  • Name:TestNG
  • location:http://beust.com/eclipse
  • 然后,勾選 testNG,點擊“Next”進行安裝 ;
  • 下載完成,點擊“Next >” 根據提示完成安裝 ;

2、離線安裝

  • testNG官網:http://testng.org/doc/
    點開之后點擊“download”

  • 點開鏈接: http://beust.com/eclipse

  • 選擇某一版本,點擊下載;
  • 將解壓縮的文件夾放到eclipse的dropin目錄下,重啟eclipse;
  • 打開Eclipse,新建-other,選擇“TestNG——>TestNG Class”,有這個就成功了;

3、安裝TestNG之后,導入jar

4、創建TestNG單元測試項目

new --> other --> TestNG --> 確定


二、TestNG 注釋

API:http://testng.org/doc/documentation-main.html

|注 解| 描 述|
|-|
|@BeforeSuite|注解的方法將只運行一次,在該套件中所有測試運行之前運行|
|@AfterSuite |注解的方法將只運行一次,在此套件中運行所有測試之后運行|
|@BeforeTest |帶注釋的方法將在所有屬于<test>標記中的類的測試方法運行之前運行。|
|@AfterTest |帶注釋的方法將在所有屬于<test>標記內的類的測試方法運行之后運行。|
|@BeforeClass |在調用當前類中的第一個測試方法之前,將運行帶注釋的方法|
|@AfterClass |在運行當前類的所有測試方法之后,將運行帶注釋的方法|
|@BeforeGroups |這個配置的組列表方法將先運行。這個方法保證在第一個測試方法被調用之前運行。|
|@AfterGroups |這個配置的組列表方法將最后運行。這個方法保證在最后一個測試方法被調用之后運行。|
|@BeforeMethod |在每個測試方法之前運行。|

@AfterMethod在每個測試方法之后運行。
@DataProvider標記方法為測試方法提供數據。帶注釋的方法必須返回一個對象[][],其中每個對象[]可以被分配到測試方法的參數列表。想要從這個DataProvider中接收數據的@Test方法需要使用DataProvider名稱,它等于這個注釋的名稱。
@Factory標記一個方法作為一個工廠,返回將被TestNG用作測試類的對象。該方法必須返回對象[]。
@Listeners在測試類中定義偵聽器。
@Parameters用于為測試方法傳遞參數
@Test標記一個類或方法作為測試的一部分。

上述的注解分為Before類別和After類,我們可以在Before類別的注解方法里面做一些初始化動作,如實例化數據庫連接、新建數據庫連接池、創建線程池、打開文件流等等;在After類別的注解方法里面做一些銷毀動作,如釋放數據庫連接、銷毀數據庫連接池、銷毀線程池或者關閉文件流等等。同一類別的不同注解會在不同的位置被調用;

beforeSuite-1 beforeSuite-2beforeTest-1beforeTest-2beforeClass-1beforeMethod-1test1-1afterMethod-1beforeMethod-1test2-1afterMethod-1afterClass-1beforeClass-2beforeMethod-2test1-2afterMethod-2beforeMethod-2test2-2afterMethod-2afterClass-2afterTest-1afterTest-2 afterSuite-1 afterSuite-1

我們可以根據自身需求,選擇特定的位置去執行一些初始化動作/銷毀動作,以及一些銷毀動作:

  • 假如你需要針對整個測試suite做初始化動作,那么應該選擇在被@BeforeSuite注解的方法里面執行
  • 如果需要針對一個<test>里面的所有測試類做初始化動作,那么可以選擇在被@BeforeTest注解的方法里面執行
  • 假如你想在每一個測試方法執行前做初始化動作,那么應該選擇@BeforeMethod

@Test 注解

@Test 注解是TestNG的核心注解,被打上該注解的方法,表示為一個測試方法

這個注解有多個配置屬性,用法為:@Test(param1 = …, param2 = …)
|屬性|描述|
|–|
|alwaysRun | 如果設置為true,這個測試方法將始終運行,即使它依賴的前置測試方法失敗|
|dataProvider | 選定傳入參數的構造器。此測試方法的數據提供程序的名稱。|
|dataProviderClass |確定參數構造器的Class類。(參數構造器首先會在當前測試類里面查找,如果參數構造器不在當前測試類定義,那么必須使用該屬性來執行它所在的Class類)|
|dependsOnGroups|確定依賴的前置測試組別。|
|dependsOnMethods | 確定依賴的前置測試方法。|
|description |測試方法描述信息。(建議為每個測試方法添加有意義的描述信息,這將會在最后的報告中展示出來)|
|enabled | 默認為true,如果指定為false,表示不執行該測試方法。|
|expectedExceptions |指定期待測試方法拋出的異常,多個異常以逗號(,)隔開。|
|groups| 指定該測試方法所屬的組,可以指定多個組,以逗號隔開。組測試的用法將在后面文章單獨介紹。|
|invocationCount | 指定測試方法需要被調用的次數。|
|invocationTimeOut| 每一次調用的超時時間,如果invocationCount沒有指定,該參數會被忽略。應用場景可以為測試獲取數據庫連接,超時就認定為失敗。單位是毫秒。|
|priority | 指定測試方法的優先級,數值越低,優先級越高,將會優先于其他數值高的測試方法被調用。(注意是針對一個測試類的優先級)|
|timeout | 指定整個測試方法的超時時間。單位是毫秒。|

@Parameters 注解:用于為測試方法傳遞參數

public class AnnotationParametersTest {@Parameters(value = {"param1", "param2"})@Testpublic void test(String arg1, String arg2) {System.out.println("use @Parameters to fill method arguments : arg 1 = " + arg1 + ", arg2 = " + arg2);} }

testng.xml配置

<test name="testAnnotationParameters"><parameter name="param1" value="value1"></parameter><parameter name="param2" value="value2"></parameter><classes><class name="com.crazypig.testngdemo.AnnotationParametersTest" /></classes> </test>

輸出結果:

use @Parameters to fill method arguments : arg 1 = value1, arg2 = value2

@DataProvider 注解

@Parameters注解可以為測試方法傳遞參數,但是這種方式參數值需要配置在testng.xml里面,靈活性不高。而**@DataProvider注解**同樣可以為測試方法傳遞參數值,并且,它是真正意義上的參數構造器,可以傳入多組測試數據對測試方法進行測試。被@DataProvider注解的方法,方法返回值必須為Object[][]或者Iterator<Object[]>。

public class AnnotationDataProviderTest {@DataProvider(name="testMethodDataProvider")public Object[][] testMethodDataProvider() { //方法返回值必須為Object[][]或者Iterator<Object[]>return new Object[][]{{"value1-1", "value2-1"}, {"value1-2", "value2-2"}, {"value1-3", "value2-3"}};}@Test(dataProvider="testMethodDataProvider")public void test(String arg1, String arg2) {System.out.println("use @DataProvider to fill method argument : arg1 = " + arg1 + " , arg2 = " + arg2);} }

testng.xml配置:

<test name="testDataProvider"><classes><class name="com.crazypig.testngdemo.AnnotationDataProviderTest" /></classes> </test>

運行結果:

use @DataProvider to fill method argument : arg1 = value1-1 , arg2 = value2-1 use @DataProvider to fill method argument : arg1 = value1-2 , arg2 = value2-2 use @DataProvider to fill method argument : arg1 = value1-3 , arg2 = value2-3

@Factory 注解

在一個方法上面打上@Factory注解,表示該方法將返回能夠被TestNG測試的測試類。利用了設計模式中的工廠模式。

public class AnnotationFactoryTest {@Factorypublic Object[] getSimpleTest() {return new Object[]{ new SimpleTest("one"), new SimpleTest("two")};} } public class SimpleTest {private String param;public SimpleTest(String param) {this.param = param;}@Testpublic void test() {System.out.println("SimpleTest.param = " + param);} }

testng.xml配置:

<test name="testFactory"><classes><class name="com.crazypig.testngdemo.AnnotationFactoryTest" /></classes> </test>

運行結果:

SimpleTest.param = one SimpleTest.param = two

@Listeners 注解

一般我們寫測試類不會涉及到這種類型的注解,這個注解必須定義在類、接口或者枚舉類級別。實用的Listener包括ISuiteListener、ITestListener和IInvokedMethodListener,他們可以在suite級別、test級別和test method一些執行點執行一些自定義操作,如打印日志。


三、testng.xml 文件

TestNG 與 Junit 比較大的一個差異就是前者通過 testng.xml 文件來配置測試用例的執行。testng.xml 文件可以很好的控制要執行的測試用例的粒度,即測試包,測試類,測試方法。

  • TestNG 官方文檔:http://testng.org/doc/documentation-main.html

testng.xml

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite1" verbose="1" ><test name="Nopackage" ><classes><class name="NoPackageTest" /></classes></test><test name="Regression1"><classes><class name="test.sample.ParameterSample"/><class name="test.sample.ParameterTest"/></classes></test> </suite>

你可以指定包名稱代替類名:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite1" verbose="1" ><test name="Regression1" ><packages><package name="test.sample" /></packages></test> </suite>

在本例中,TestNG將查看test.sample包中的所有類,并且只保留有TestNG注釋的類。
你還可以指定包含和排除的組和方法:

<test name="Regression1"><groups><run><exclude name="brokenTests" /> //排除不執行的測試用例<include name="checkinTests" /> //指定執行的測試用例</run></groups> <classes><class name="test.IndividualMethodsTest"><methods><include name="testMethod" /></methods></class></classes> </test>

你還可以在 testng.xml 中定義新的組。并在屬性中指定額外的細節,比如是否并行運行測試、使用多少線程、是否運行JUnit測試等等……
在默認情況下,TestNG將按照在XML文件中找到的順序運行測試。如果您希望在這個文件中列出的類和方法以不可預測的順序運行,則將preserve-order屬性設置為false。

<test name="Regression1" preserve-order="false"><classes><class name="test.Test1"><methods><include name="m3" /><include name="m1" /><include name="m2" /></methods></class><class name="test.Test2" /></classes> </test>

preserve-order 參數用于控制測試用例的執行順序。

  • 如果為:Ture,測試用例的順序為:m3 > m1 > m2;
  • 如果為 :false,那么默認會按照用例的名稱的有字母/數字的順序執行:m1 > m2 > m3;

多線程執行測試用例:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"><suite name="suite1" parallel="classes" thread-count="2" ><test verbose="2" name="test1"><classes><class name="com.testng.test.testBaidu"/><class name="com.testng.test.testYoudao"/></classes></test> </suite>
  • parallel 表示你需要對哪個級別進行多線程;
  • thread-count 用于指定線程的個數;

參考:
parallel=“methods” 每個方法都將采用獨立的線程進行測試;
parallel=“classes” 將把每個<class>標簽內的所有方法在同一個線程中執行,但是<classes>中的不同<class>將會以不同的線程執行;
parallel=“instances” TestNg 將把同一個實例內的所有方法運行在同一個線程中,但是如果兩個方法是在不同的實例中,那么他們將會在不同的線程中執行;


四、運行測試用例、查看測試結果

在運行測試用例之前,我們首先要用 TestNG 編寫一個單元測試用例,我們以百度搜索為例,代碼如下:

testBaidu.java

package com.testng.test; import ......public class testBaidu {private WebDriver driver;private String baseUrl;@BeforeClasspublic void setUp() throws Exception {driver = new ChromeDriver();baseUrl = "https://www.baidu.com/";driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);}@Testpublic void testCase() throws Exception {driver.get(baseUrl + "/");driver.findElement(By.id("kw")).sendKeys("testNG");driver.findElement(By.id("su")).click();Thread.sleep(2000);String title =driver.getTitle();assertEquals(title,"testNG_百度搜索");}@AfterClasspublic void tearDown() throws Exception {driver.quit();} }

TestNG 的運行測試用例有3種方法:

(1)方法一:通過class來執行:

org.testng.TestNG testng = new org.testng.TestNG(); testng.setTestClasses(new Class[]{TestCaseMonitor.class}); testng.run();

新建一個TestNG對象,setTestClass傳遞一個用例的class進去,然后執行用例run();

(1)方法二

在測試用例文件右鍵,選擇 Run As —> TestNG Test 運行;

注意:若直接在綠色框里的文件名處右擊“run as ”無選項,因為沒有主函數;需要在紅色框 testCase() 處右擊運行;

(2)方法三

創建 testng.xml 配置文件;其實方法一也需要 xml 配置文件,只是 TestNG 默認幫我們創建了一個 testng-customsuite.xml,該文件的路徑在上面的運行結果中;

在包中右鍵,選擇創建 file;輸入文件名為 testng.xml,默認一般就叫這名;點擊“Finish”完成文件的創建;

testng.xml 配置如下:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"><suite name="suite1"><test verbose="2" name="test1"><classes><class name="com.testng.test.testBaidu"/></classes></test> </suite>

在 testng.xml 文件中右鍵 Run As —> TestNG Test 運行;


TestNG 默認會在項目的目錄下生成測試報告: .../WorkSpace\myPro\test-output/emailable-report.html


五、TestNG 測試技巧

1、依賴性測試

JUnit 框架想達到的一個目標就是測試隔離。

它的缺點是:人們很難確定測試用例執行的順序,而這對于任何類型的依賴性測試都非常重要。開發者們使用了多種技術來解決這個問題,例如,按字母順序指定測試用例,或是更多地依靠 fixture 來適當地解決問題。如果測試成功,這些解決方法都沒什么問題。但是,如果測試不成功,就會產生一個很麻煩的后果: 所有后續的依賴測試也會失敗。在某些情況下,這會使大型測試套件報告出許多不必要的錯誤。

例如:假設有一個測試套件測試一個需要登錄的 Web 應用程序。您可以創建一個有依賴關系的方法,通過登錄到這個應用程序來創建整個測試套件,從而避免 JUnit 的隔離機制。這種解決方法不錯,但是如果登錄失敗, 即使登錄該應用程序后的其他功能都正常工作,整個測試套件依然會全部失敗!

跳過,而不是標為失敗!

與 JUnit 不同,TestNG 利用 Test 注釋的 dependsOnMethods 屬性來應對測試的依賴性問題。有了這個便利的特性,就可以輕松指定依賴方法。例如,前面所說的登錄將在某個方法之前運行。此外,如果依賴 方法失敗,它將被跳過,而不是標記為失敗。

這個特性就非常有用了,例 126 郵箱的測試,用例都基于登錄郵箱之后的驗證,如果驗證登錄的用例失敗了,那么登錄郵箱收發郵件的用例其實也沒必要運行了。

testMail.java

package com.testng.test; import ......public class testMail {public static void login(WebDriver driver,String username,String password){ //登錄方法driver.findElement(By.id("idInput")).clear();driver.findElement(By.id("idInput")).sendKeys(username);driver.findElement(By.id("pwdInput")).clear();driver.findElement(By.id("pwdInput")).sendKeys(password);driver.findElement(By.id("loginBtn")).click();}public static void logout(WebDriver driver){ //退出方法driver.findElement(By.linkText("退出")).click();}@Testpublic void verifyLogin() { //驗證登錄測試用例WebDriver driver = new ChromeDriver();driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);driver.get("http://www.126.com");String username = "testingwtb";String password = "a123456";login(driver,username,password); //調用登錄方法String text = driver.findElement(By.id("spnUid")).getText();assertEquals(text,"testingwtb@126.com");logout(driver); //調用退出方法driver.quit();}@Test (dependsOnMethods = {"verifyLogin"}) //這個測試用例是否執行取決于verifyLogin方法public void verifySearchMail() {WebDriver driver = new ChromeDriver();driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);driver.get("http://www.126.com");String username = "testingwtb";String password = "a123456";login(driver,username,password);//搜索WebElement search = driver.findElement(By.xpath("//input[@class='nui-ipt-input' and @type='text']"));search.sendKeys("小明");search.sendKeys(Keys.ENTER);String text = driver.findElement(By.className("nui-title-text")).getText();System.out.println(text);assertEquals(text,"搜索結果");logout(driver);driver.quit();} }

上面的例子中定義了兩個測試:一個驗證登錄,另一個驗證賬戶信息。請注意,通過使用 Test 注釋的dependsOnMethods={“verifyLogin”}子句,verifyAccountInfo 測試指定了它依賴 verifyLogin()方法。

2、忽略測試

有時候測試用例還沒準備好,可以給測試用例加上**@Test(enable = false)**,用來禁止此測試用例;
testMail.java

package com.testng.test; import ......public class testMail {public static void login(WebDriver driver,String username,String password){ //登錄方法driver.findElement(By.id("idInput")).clear();driver.findElement(By.id("idInput")).sendKeys(username);driver.findElement(By.id("pwdInput")).clear();driver.findElement(By.id("pwdInput")).sendKeys(password);driver.findElement(By.id("loginBtn")).click();}public static void logout(WebDriver driver){ //退出方法driver.findElement(By.linkText("退出")).click();}@Test(enabled = false) //忽略這條用例 public void verifyLogin() { WebDriver driver = new ChromeDriver();driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);driver.get("http://www.126.com");String username = "testingwtb";String password = "a123456";login(driver,username,password);String text = driver.findElement(By.id("spnUid")).getText();assertEquals(text,"testingwtb@126.com");logout(driver);driver.quit();} }

3、參數化測試

TestNG 中另一個有趣的特性是參數化測試。

在 JUnit 中,如果您想改變某個受測方法的參數組,就只能給每個不同的參數組編寫一個測試用例。多數情況下,這不會帶來太多麻煩。然而,我們有時會碰到一些情況,對其中的業務邏輯,需要運行的測試數目變化范圍很大。在這樣的情況下,使用 JUnit 的測試人員往往會轉而使用 FIT(驗收測試框架)這樣的框架,因為這樣就可以用表格數據驅動測試。但是 TestNG 提供了開箱即用的類似特性。

通過在 TestNG 的 XML 配置文件中放入參數化數據,就可以對不同的數據集重用同一個測試用例,甚至有可能會得到不同的結果。這種技術完美地避免了只能假定一切正常的測試,或是沒有對邊界進行有效驗證的情況。

Eg1 : 通過 testng.xml 傳遞參數給測試代碼

testBaidu.java

package com.testng.test; import ......public class testBaidu {private WebDriver driver;private String baseUrl;@BeforeClasspublic void setUp() throws Exception {driver = new ChromeDriver();baseUrl = "https://www.baidu.com/";driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);}@Test@Parameters("test1") //設置測試方法的入參public void testCase(String test1) throws Exception {driver.get(baseUrl + "/");System.out.println("sreach key value:"+ test1);driver.findElement(By.id("kw")).sendKeys(test1);driver.findElement(By.id("su")).click();Thread.sleep(2000);String title =driver.getTitle();assertEquals(title,test1+"_百度搜索");}@AfterClasspublic void tearDown() throws Exception {driver.quit();} }

對應的 testng.xml 文件配置如下:
testng.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="suite1"><parameter name="test1" value="testng" /> //定義 test1 的 value <test name="test1"><classes><class name="com.testng.test.testBaidu"/></classes></test> </suite>

Eg2 : 通過 DataProvider 傳遞參數
testng.xml

package com.testng.test; import ......public class mailLogin {private WebDriver driver;private String baseUrl;@BeforeClasspublic void setUp() throws Exception {driver = new ChromeDriver();baseUrl = "http://www.126.com";driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);}@DataProvider(name="user") //定義對象數組public Object[][] Users(){return new Object[][]{{"testingwtb","a123456"},};}@Test(dataProvider="user") //調用 user 數組的值public void testCase(String username,String password) throws Exception {driver.get(baseUrl);driver.findElement(By.id("idInput")).clear();driver.findElement(By.id("idInput")).sendKeys(username);driver.findElement(By.id("pwdInput")).clear();driver.findElement(By.id("pwdInput")).sendKeys(password);driver.findElement(By.id("loginBtn")).click();Thread.sleep(2000);String text = driver.findElement(By.id("spnUid")).getText();assertEquals(text,username+"@126.com");}@AfterClasspublic void tearDown() throws Exception {driver.quit();} }

總結

以上是生活随笔為你收集整理的*TestNG的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。