單元測試框架之——TestNG

1、什麼是TestNG
TestNG(Next Generation)單元測試框架比JUnit單元測試框架更強大,它提供了更多的擴展功能,可以通過註解、分組、序列和參數化組織和執行自動化測試腳本,因此它適合運行更復雜的自動化測試用例。
TestNG的優點:
(1)漂亮的HTML格式測試報告
(2)支持併發測試
(3)參數化測試更簡單
(4)支持輸出日誌
(5)支持跟過功能的註解

2、編寫TestNG測試用例的步驟
(1)使用eclipse生成TestNG的測試程序框架
(2)在生成的程序框架中編寫測試代碼邏輯
(3)根據測試代碼邏輯,插入TestNG註解標籤
(4)配置Testng.xml文件,設定測試類、測試方法、測試分組的執行信息
(5)執行TestNG的測試程序

3、安裝TestNG
見另一篇博客“Eclipse安裝TestNG插件”,https://blog.csdn.net/fengke1813/article/details/80264880

4、在TestNG中運行第一個WebDriver測試用例
單擊選中的新建文件,按下Ctr+N組合鍵,選擇“TestNG”文件下的“TestNG class”,點擊“next”,在彈出的對話框中選擇輸入工程、包名和類名。注意選擇工程時,具體到工程文件的下一層\src文件,因爲系統默認是找到src下的class文件運行,可以到設置裏面改路徑。
生成測試框架代碼以後,將selenium的jar包導入到工程中,在代碼中填充Webdriver的測試邏輯代碼:

package cn.gloryroad;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;

public class FirstTestNGDemo {
  public WebDriver driver;
  String baseUrl = "http://www.sogou.com/";
  @Test
  public void testSearch() {
      //打開搜狗首頁
      driver.get(baseUrl);
      //在搜索框輸入“光榮之路自動化測試”
      driver.findElement(By.id("query")).sendKeys("光榮之路自動化測試");
      //單擊搜索按鈕
      driver.findElement(By.id("stb")).click();
  }
  @BeforeMethod
  public void beforeMethod() {
      //若無法打開Firefox瀏覽器,可設定Firefox瀏覽器的安裝路徑
      System.setProperty("WebDriver.firefox.bin", "C:/Program Files/Mozilla Firefox");
      //打開Firefox瀏覽器
      driver = new FirefoxDriver();
  }

  @AfterMethod
  public void afterMethod() {
      //關閉瀏覽器
      driver.quit();
  }

}

以“TestNG Test”命令運行後的結果:
這裏寫圖片描述

TestNG也會輸出HTML格式的測試報告,訪問工程目錄下的“test-output”目錄,打開“emailable-report.html”文件:
這裏寫圖片描述
TestNG也會在“test-output”目錄中生成index.html文件的報告,提供更加詳細的測試用例執行信息:
這裏寫圖片描述

4、TestNG的常用註解
(1)TestNG的常見測試用的組織結構:
Test Suit由一個或者多個Test組成;
Test由一個或者多個測試Class組成;
一個測試Class由一個或者多個測試方法組成;
(2)常用註解
@BeforeSuit:表示此註解的方法會在當前測試集合(Suit)中的任一測試用例開始運行之前執行;
@AfterSuit:表示此註解的方法會在當前測試集合(Suit)中的任一測試程序結束之後執行;
@BeforeTest:表示此註解的方法會在Test中任一測試用例開始運行之前執行;
@AfterTest:表示此註解會的方法在Test中任一測試用例運行結束之後執行;
@BeforeGroup:表示此註解的方法會在分組測試用例的任一測試用例開始運行前執行;
@AfterGroup:表示此註解的方法會在分組測試用例的所有測試用例運行結束後執行;
@BeforeClass:表示此註解的方法會在當前測試類的任一測試用例開始運行前執行;
@AfterClass:表示此註解的方法會在當前測試類的所有測試用例結束後執行;
@BeforeMethod:表示此註解的方法會在每個測試方法開始運行前執行;
@AfterMethod:表示此註解的方法會在每個測試方法結束後執行;
@Test:表示此註解的方法被認定爲是一個測試方法,即一個測試用例。

5、測試集合
在自動化測試的執行過程中,通常會產生批量運行多個測試用例的需求,此需求被稱爲運行測試集合(Suit)。TestNG的測試用例可以是獨立的,也可以按照特定的順序來執行。
通過TestNG.xml的配置,可實現運行多個測試用例的不同組合。
操作步驟:
(1)右擊工程名,選擇“new”->“file”命令,在彈出的對話框的“file.name”輸入框中輸入“testng.xml”,點擊“finish”創建TestNG的XML配置文件。
(2)雙擊testng.xml的文件,選擇sourse標籤欄進行編輯。

<suite name = "TestNGSuite">
     <test name = "test1">
         <classes>

              <class name = "cn.gloryroad.FirstTestNGDemo"/>
              <class name = "cn.gloryroad.TestBaidu"/>

         </classes>
     </test>
</suite>   

(3)執行testng.xml文件名,在測試結果中可驗證兩個測試類的測試方法均被執行。
這裏寫圖片描述

6、測試用例的分組
使用group關鍵字進行分組,用來執行多個Test的測試用例。
操作步驟:
(1)新建一個名爲Grouping的測試類,編寫如下代碼:

package cn.gloryroad;

import org.testng.annotations.Test;

public class Grouping {
  @Test(groups = {"人"})
  public void student() {
      System.out.println("學生方法被調用");
  }
  @Test(groups = {"人"})
  public void teacher(){
      System.out.println("老師方法被調用");
  }
  @Test(groups = {"動物"})
  public void cat(){
      System.out.println("小貓方法被調用");
  }
  @Test(groups = {"動物"})
  public void dog(){
      System.out.println("小狗方法被調用");
  }
  @Test(groups = {"人","動物"})
  public void feeder(){
      System.out.println("飼養員方法被調用");
  }
}

(3)testng.xml的內容配置如下:

<suite name = "TestNGSuite">
     <test name = "Grouping">
     <groups>
        <run>
           <include name = "動物"/>
        </run>
     </groups>

     <classes>
     <class name = "cn.gloryroad.Grouping"/>
     </classes>

     </test>

</suite>    

(4)運行testng.xml文件,結果如下:
這裏寫圖片描述
(5)如果想同時執行兩個分組中的所有測試用例,修改testng.xml文件爲:

<suite name = "TestNGSuite">
     <test name = "Grouping">
     <groups>

        <define name = "All">
           <include name = "人"/>
           <include name = "動物"/>
        </define>

        <run>
           <include name = "All"/>
        </run>

     </groups>

     <classes>
     <class name = "cn.gloryroad.Grouping"/>
     </classes>

     </test>

</suite>    

7、依賴測試
對於具有依賴性的測試用例,需要保證某個測試用例執行完之後才執行其他測試用例,此測試場景運行需求稱爲依賴測試。通過測試,可在不同測試方法間共享數據和程序狀態。使用dependsOnMethods參數來實現。

package cn.gloryroad;

import org.testng.annotations.Test;

public class DependentTest {
  @Test(dependsOnMethods = {"OpenBrowser"})
  public void SignIn() {
      System.out.println("SignIn方法被調用");
  }
  @Test
  public void OpenBrowser(){
      System.out.println("OpenBrowser方法被調用");
  }
  @Test(dependsOnMethods = {"SignIn"})
  public void LogOut(){
      System.out.println("LogOut方法被調用");
  }
}

運行結果:
這裏寫圖片描述

8、特定順序執行測試用例
對於非依賴性的測試用例也可以實現按指定順序執行,使用priority來實現。
測試代碼:

package cn.gloryroad;

import org.testng.annotations.Test;

public class SequenceTest {
  @Test(priority = 2)
  public void test3() {
      System.out.println("test3");
  }
  @Test(priority = 3)
  public void test4() {
      System.out.println("test3");
  }
  @Test(priority = 0)
  public void test1() {
      System.out.println("test3");
  }
  @Test(priority = 1)
  public void test2() {
      System.out.println("test3");
  }
}

測試結果:
這裏寫圖片描述

9、跳過某個測試方法
使用參數enabled=false來跳過某個參數。

package cn.gloryroad;

import org.testng.annotations.Test;

public class SequenceTest {
  @Test(priority = 2)
  public void test3() {
      System.out.println("test3");
  }
  @Test(priority = 3)
  public void test4() {
      System.out.println("test3");
  }
  @Test(priority = 0)
  public void test1() {
      System.out.println("test3");
  }
  @Test(priority = 1,enabled = false)
  public void test2() {
      System.out.println("test3");
  }
}

這裏寫圖片描述

10、測試報告中的自定義日誌
日誌功能可通過自定義的方式記錄測試腳本的運行信息。一般使用兩種模式進行記錄,及高層級和低層級。低層級模式日誌會記錄所有測試步驟信息,高層級模式日誌只記錄測試腳本中的主要時間信息。可根據需求選擇日誌信息的記錄層級。

package cn.gloryroad;

import org.testng.Reporter;
import org.testng.annotations.Test;

public class TestngReporter {
  @Test
  public void OpenBrowser() {
      System.out.println("OpenBrowser方法被調用");
      Reporter.log("調用打開瀏覽器的方法");
  }
  @Test
  public void SignIn() {
      System.out.println("SignIn方法被調用");
      Reporter.log("調用登錄的方法");
  }
  @Test
  public void LogOut() {
      System.out.println("LogOut方法被調用");
      Reporter.log("調用註銷的方法");
  }
}

可在index.html測試報告中查看運行的Report Log信息。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章