TestNG 快速指南



TestNG - 概述

測試是檢查應用程式功能以確保其按要求工作的過程。單元測試在開發人員級別出現,其中採取了充分的措施來測試每個單一實體(類或方法),以確保最終產品滿足要求。

與其他任何測試框架相比,JUnit 使開發人員瞭解測試(尤其是單元測試)的有用性。JUnit 利用相當簡單、實用且嚴格的架構,已經能夠“影響”大量的開發人員。請檢視我們關於 JUnit 的教程,以瞭解其功能。同時,JUnit 也有一些缺點,如下所示:

  • 最初設計僅用於啟用單元測試,現在用於各種測試。

  • 無法進行依賴性測試。

  • 配置控制較差 (setUp/tearDown)。

  • 侵入式(強制您擴充套件類並以某種方式命名您的方法)。

  • 靜態程式設計模型(強制您不必要地重新編譯)。

  • 在複雜專案中管理不同的測試套件可能非常棘手。

什麼是 TestNG?

根據其文件對 TestNG 的定義如下:

TestNG 是一個從 JUnit 和 NUnit 獲得靈感的測試框架,但引入了一些新功能,使其功能更強大且更易於使用。

TestNG 是一個開源的自動化測試框架;其中 NG 代表 NextGeneration(下一代)。TestNG 類似於 JUnit(尤其是 JUnit 4),但它不是 JUnit 的擴充套件。它受到 JUnit 的啟發。它旨在比 JUnit 更好,尤其是在測試整合類時。TestNG 的建立者是 Cedric Beust

TestNG 消除了大多數舊框架的侷限性,使開發人員能夠編寫更靈活、更強大的測試。因為它大量借鑑了 Java 註解(JDK 5.0 引入)來定義測試,它還可以向您展示如何在實際生產環境中使用 Java 語言的這一新功能。

TestNG 特性

  • 支援註解。

  • TestNG 使用更多 Java 和麵向物件特性。

  • 支援測試整合類(例如,預設情況下,無需為每個測試方法建立新的測試類例項)。

  • 將編譯時測試程式碼與執行時配置/資料資訊分開。

  • 靈活的執行時配置。

  • 引入了“測試組”。編譯測試後,您可以只要求 TestNG 執行所有“前端”測試,或“快速”、“慢速”、“資料庫”測試等。

  • 支援依賴測試方法、並行測試、負載測試和部分失敗。

  • 靈活的外掛 API。

  • 支援多執行緒測試。

TestNG - 環境配置

TestNG 是一個 Java 框架,因此首要要求是在您的機器上安裝 JDK。

系統需求

JDK 1.5 或更高版本。
記憶體 無最低要求。
磁碟空間 無最低要求。
作業系統 無最低要求。

步驟 1 - 驗證您的機器上是否安裝了 Java

開啟控制檯並根據您在系統上安裝的作業系統執行 java 命令。

作業系統 任務 命令
Windows 開啟命令控制檯 c:\> java -version
Linux 開啟命令終端 $ java -version
Mac 開啟終端 machine:~ joseph$ java -version

讓我們驗證所有作業系統的輸出:

作業系統 輸出
Windows

java version "1.7.0_25"

Java(TM) SE Runtime Environment (build 1.7.0_25-b15)

Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

Linux

java version "1.7.0_25"

Java(TM) SE Runtime Environment (build 1.7.0_25-b15)

Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

Mac

java version "1.7.0_25"

Java(TM) SE Runtime Environment (build 1.7.0_25-b15)

Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

如果您沒有 Java,請從 https://www.oracle.com/technetwork/java/javase/downloads/index.html 安裝 Java 軟體開發工具包 (SDK)。在本教程中,我們假設已安裝 Java 1.7.0_25 版本。

步驟 2:設定 JAVA 環境

設定 **JAVA_HOME** 環境變數以指向 Java 安裝在您機器上的基目錄位置。例如:

作業系統 輸出
Windows 將環境變數 JAVA_HOME 設定為 C:\Program Files\Java\jdk1.7.0_25。
Linux Export JAVA_HOME=/usr/local/java-current。
Mac Export JAVA_HOME=/Library/Java/Home。

將 Java 編譯器位置新增到系統路徑。

作業系統 輸出
Windows 在系統變數 Path 的末尾附加字串 C:\Program Files\Java\jdk1.7.0_25\bin。
Linux Export PATH=$PATH:$JAVA_HOME/bin/
Mac 不需要

使用上面解釋的命令 **java -version** 驗證 Java 安裝。

步驟 3:下載 TestNG 歸檔檔案

http://www.testng.org 下載最新版本的 TestNG jar 檔案。在撰寫本教程時,我們已下載 testng-6.8.jar 並將其複製到 C:\> TestNG 資料夾。

作業系統 歸檔檔名
Windows testng-6.8.jar
Linux testng-6.8.jar
Mac testng-6.8.jar

步驟 4:設定 TestNG 環境

設定 **TESTNG_HOME** 環境變數以指向 TestNG jar 儲存在您機器上的基目錄位置。下表顯示瞭如何在 Windows、Linux 和 Mac 上設定環境變數,假設我們將 testng-6.8.jar 儲存在 C:\>TestNG 位置。

作業系統 說明
Windows 將環境變數 TESTNG_HOME 設定為 C:\TESTNG。
Linux Export TESTNG_HOME=/usr/local/TESTNG
Mac Export TESTNG_HOME=/Library/TESTNG

步驟 5:設定 CLASSPATH 變數

設定 **CLASSPATH** 環境變數以指向 TestNG jar 位置。

作業系統 說明
Windows 將環境變數 CLASSPATH 設定為 %CLASSPATH%;%TESTNG_HOME%\testng-6.8.jar。
Linux Export CLASSPATH=$CLASSPATH:$TESTNG_HOME/testng-6.8.jar。
Mac Export CLASSPATH=$CLASSPATH:$TESTNG_HOME/testng-6.8.jar。

步驟 6:測試 TestNG 設定

在 **C:\>TestNG_WORKSPACE** 中建立一個名為 TestNGSimpleTest 的 Java 類檔案。

import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;

public class TestNGSimpleTest {
   @Test
   public void testAdd() {
      String str = "TestNG is working fine";
      AssertEquals("TestNG is working fine", str);
   }
}

TestNG 可以通過幾種不同的方式呼叫:

  • 使用 testng.xml 檔案。
  • 使用 ANT。
  • 從命令列。

讓我們使用 testng.xml 檔案呼叫。在 **C:\>TestNG_WORKSPACE** 中建立一個名為 testng.xml 的 xml 檔案來執行測試用例。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "TestNGSimpleTest"/>
      </classes>
   </test>
</suite>	

步驟 7:驗證結果

使用 **javac** 編譯器編譯類,如下所示:

C:\TestNG_WORKSPACE>javac TestNGSimpleTest.java

現在,呼叫 testng.xml 以檢視結果:

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。

===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================

TestNG -編寫測試用例

在 TestNG 中編寫測試基本上涉及以下步驟:

  • 編寫測試的業務邏輯並在程式碼中插入 TestNG 註解。

  • 在 testng.xml 檔案或 build.xml 檔案中新增有關測試的資訊(例如類名、要執行的組等)。

  • 執行 TestNG。

在這裡,我們將看到一個使用 POJO 類、業務邏輯類和測試 xml 的 TestNG 測試完整示例,TestNG 將執行它。

在 **C:\>TestNG_WORKSPACE** 中建立 **EmployeeDetails.java**,這是一個 POJO 類。

public class EmployeeDetails {

   private String name;
   private double monthlySalary;
   private int age;
   
   // @return the name

   public String getName() {
      return name;
   }
   
   // @param name the name to set
   
   public void setName(String name) {
      this.name = name;
   }
   
   // @return the monthlySalary

   public double getMonthlySalary() {
      return monthlySalary;
   }
   
   // @param monthlySalary the monthlySalary to set
   
   public void setMonthlySalary(double monthlySalary) {
      this.monthlySalary = monthlySalary;
   }
   
   // @return the age
 
   public int getAge() {
      return age;
   }
   
   // @param age the age to set
 
   public void setAge(int age) {
      this.age = age;
   }
}

**EmployeeDetails** 類用於:

  • 獲取/設定員工姓名的值。
  • 獲取/設定員工月薪的值。
  • 獲取/設定員工年齡的值。

在 **C:\>TestNG_WORKSPACE** 中建立一個 **EmpBusinessLogic.java**,其中包含業務邏輯。

public class EmpBusinessLogic {

   // Calculate the yearly salary of employee
   public double calculateYearlySalary(EmployeeDetails employeeDetails) {
      double yearlySalary = 0;
      yearlySalary = employeeDetails.getMonthlySalary() * 12;
      return yearlySalary;
   }
	
   // Calculate the appraisal amount of employee
   public double calculateAppraisal(EmployeeDetails employeeDetails) {
   
      double appraisal = 0;
      
      if(employeeDetails.getMonthlySalary() < 10000) {
         appraisal = 500;
         
      } else {
         appraisal = 1000;
      }
      
      return appraisal;
   }
}

**EmpBusinessLogic** 類用於計算:

  • 員工的年薪。
  • 員工的考核金額。

現在,讓我們在 C:\>TestNG_WORKSPACE 中建立一個名為 **TestEmployeeDetails.java** 的 TestNG 類。TestNG 類是一個包含至少一個 TestNG 註解的 Java 類。此類包含要測試的測試用例。TestNG 測試可以透過 @BeforeXXX 和 @AfterXXX 註解進行配置(我們將在 TestNG - 執行流程 一章中看到),這允許在某個點之前和之後執行一些 Java 邏輯。

import org.testng.Assert;
import org.testng.annotations.Test;

public class TestEmployeeDetails {
   EmpBusinessLogic empBusinessLogic = new EmpBusinessLogic();
   EmployeeDetails employee = new EmployeeDetails();

   @Test
   public void testCalculateAppriasal() {
   
      employee.setName("Rajeev");
      employee.setAge(25);
      employee.setMonthlySalary(8000);
      
      double appraisal = empBusinessLogic.calculateAppraisal(employee);
      Assert.assertEquals(500, appraisal, 0.0, "500");
   }

   // Test to check yearly salary
   @Test
   public void testCalculateYearlySalary() {
   
      employee.setName("Rajeev");
      employee.setAge(25);
      employee.setMonthlySalary(8000);
      
      double salary = empBusinessLogic.calculateYearlySalary(employee);
      Assert.assertEquals(96000, salary, 0.0, "8000");
   }
}

**TestEmployeeDetails** 類用於測試 **EmpBusinessLogic** 類的各個方法。它執行以下操作:

  • 測試員工的年薪。

  • 測試員工的考核金額。

在執行測試之前,必須使用特殊的 XML 檔案(通常名為 testng.xml)配置 TestNG。此檔案的語法非常簡單,其內容如下所示。在 **C:\>TestNG_WORKSPACE** 中建立此檔案。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "TestEmployeeDetails"/>
      </classes>
   </test>
</suite>

上述檔案的詳細資訊如下:

  • 套件由一個 XML 檔案表示。它可以包含一個或多個測試,並由 <suite> 標記定義。

  • <test> 標記表示一個測試,可以包含一個或多個 TestNG 類。

  • <class> 標記表示一個 TestNG 類。它是一個包含至少一個 TestNG 註解的 Java 類。它可以包含一個或多個測試方法。

使用 javac 編譯測試用例類。

C:\TestNG_WORKSPACE>javac EmployeeDetails.java EmpBusinessLogic.java TestEmployeeDetails.java

現在使用以下命令執行 TestNG:

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

如果一切正確完成,您應該在控制檯中看到測試結果。此外,TestNG 在當前目錄中自動建立的名為 **test-output** 的資料夾中建立一個非常好的 HTML 報告。如果您開啟它並載入 index.html,您將看到類似於下圖中的頁面:

Writing Tests

TestNG - 基本註解

在 JUnit 3 中指示測試方法的傳統方法是在其名稱前加上 test。這是一種標記類中某些方法具有特殊含義的非常有效的方法,但命名不能很好地擴充套件(如果我們想為不同的框架新增更多標記怎麼辦?)並且相當不靈活(如果我們想傳遞其他引數到測試框架怎麼辦?)。

註解在 JDK 5 中正式新增到 Java 語言中,TestNG 選擇使用註解來註解測試類。

以下是 TestNG 支援的註解列表:

序號 註解和描述
1

@BeforeSuite

僅在該套件中的所有測試執行之前執行一次。

2

@AfterSuite

僅在該套件中的所有測試執行之後執行一次。

3

@BeforeClass

僅在呼叫當前類中的第一個測試方法之前執行一次。

4

@AfterClass

僅在當前類中的所有測試方法執行之後執行一次。

5

@BeforeTest

在執行 <test> 標記內的類中的任何測試方法之前執行。

6

@AfterTest

在執行 <test> 標記內的類中的所有測試方法之後執行。

7

@BeforeGroups

此配置方法將在其之前執行的組列表。保證此方法在呼叫屬於這些組中的任何一個的第一個測試方法之前不久執行。

8

@AfterGroups

此配置方法將在其之後執行的組列表。保證此方法在呼叫屬於這些組中的任何一個的最後一個測試方法之後不久執行。

9

@BeforeMethod

帶註解的方法將在每個測試方法之前執行。

10

@AfterMethod

帶註解的方法將在每個測試方法之後執行。

11

@DataProvider

將一個方法標記為為測試方法提供資料。帶註解的方法必須返回一個 Object[][],其中每個 Object[] 可以賦值給測試方法的引數列表。想要從這個 DataProvider 接收資料的 @Test 方法需要使用一個數據提供程式名稱,該名稱等於此註解的名稱。

12

@Factory

將一個方法標記為一個工廠,該工廠返回 TestNG 將用作測試類的物件。該方法必須返回 Object[]。

13

@Listeners

在測試類上定義監聽器。

14

@Parameters

描述如何將引數傳遞給 @Test 方法。

15

@Test

將類或方法標記為測試的一部分。

使用註解的好處

以下是使用註解的一些好處:

  • TestNG 透過查詢註解來識別它感興趣的方法。因此,方法名稱不受任何模式或格式的限制。

  • 我們可以向註解傳遞附加引數。

  • 註解是強型別的,因此編譯器會立即標記任何錯誤。

  • 測試類不再需要擴充套件任何內容(例如 JUnit 3 的 TestCase)。

TestNG - 執行過程

本章解釋 TestNG 中方法的執行過程。它解釋了呼叫的方法的順序。以下是 TestNG 測試 API 方法的執行過程以及一個示例。

C:\>TestNG_WORKSPACE 中建立一個名為 TestngAnnotation.java 的 Java 類檔案來測試註解。

import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterSuite;

public class TestngAnnotation {
   // test case 1
   @Test
   public void testCase1() {
      System.out.println("in test case 1");
   }

   // test case 2
   @Test
   public void testCase2() {
      System.out.println("in test case 2");
   }

   @BeforeMethod
   public void beforeMethod() {
      System.out.println("in beforeMethod");
   }

   @AfterMethod
   public void afterMethod() {
      System.out.println("in afterMethod");
   }

   @BeforeClass
   public void beforeClass() {
      System.out.println("in beforeClass");
   }

   @AfterClass
   public void afterClass() {
      System.out.println("in afterClass");
   }

   @BeforeTest
   public void beforeTest() {
      System.out.println("in beforeTest");
   }

   @AfterTest
   public void afterTest() {
      System.out.println("in afterTest");
   }

   @BeforeSuite
   public void beforeSuite() {
      System.out.println("in beforeSuite");
   }

   @AfterSuite
   public void afterSuite() {
      System.out.println("in afterSuite");
   }

}

接下來,讓我們在 C:\>TestNG_WORKSPACE 中建立 testng.xml 檔案來執行註解。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "TestngAnnotation"/>
      </classes>
   </test>
</suite>

使用 javac 編譯測試用例類。

C:\TestNG_WORKSPACE>javac TestngAnnotation.java

現在,執行 testng.xml,它將執行在提供的測試用例類中定義的測試用例。

C:\TestNG_WORKSPACE>java org.testng.TestNG testng.xml

驗證輸出。

in beforeSuite
in beforeTest
in beforeClass
in beforeMethod
in test case 1
in afterMethod
in beforeMethod
in test case 2
in afterMethod
in afterClass
in afterTest
in afterSuite

===============================================
Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================

根據以上輸出,執行過程如下:

  • 首先,beforeSuite() 方法只執行一次。

  • 最後,afterSuite() 方法只執行一次。

  • beforeTest()、beforeClass()、afterClass() 和 afterTest() 方法也只執行一次。

  • beforeMethod() 方法為每個測試用例執行,但在執行測試用例之前。

  • afterMethod() 方法為每個測試用例執行,但在執行測試用例之後。

  • 在 beforeMethod() 和 afterMethod() 之間,每個測試用例都會執行。

TestNG - 執行測試

測試用例是使用 TestNG 類執行的。此類是執行 TestNG 框架中測試的主要入口點。使用者可以建立自己的 TestNG 物件並透過多種不同的方式呼叫它,例如:

  • 在一個現有的 testng.xml 上。

  • 在一個完全從 Java 建立的合成 testng.xml 上。

  • 透過直接設定測試類。

您還可以定義要包含或排除的組,分配引數等。命令列引數為:

  • -d outputdir:指定輸出目錄。

  • -testclass class_name:指定一個或多個類名。

  • -testjar jar_name:指定包含測試的 jar 檔案。

  • -sourcedir src1;src2:用分號分隔的源目錄列表(僅在使用 javadoc 註解時使用)。

  • -target

  • -groups

  • -testrunfactory

  • -listener

在下面的示例中,我們將建立一個 TestNG 物件和一個現有的 testng.xml。

建立類

建立一個要測試的 Java 類,例如,在 C:\>TestNG_WORKSPACE 中建立 MessageUtil.java

/*
* This class prints the given message on console.
*/

public class MessageUtil {

   private String message;

   //Constructor
   //@param message to be printed
   public MessageUtil(String message) {
      this.message = message;
   }
      
   // prints the message
   public String printMessage() {
      System.out.println(message);
      return message;
   }   
}  

建立測試用例類

  • 建立一個 Java 測試類,例如,SampleTest.java

  • 向你的測試類中新增一個測試方法 testPrintMessage()。

  • 向 testPrintMessage() 方法添加註解 @Test。

  • 實現測試條件並使用 TestNG 的 assertEquals API 檢查條件。

C:\>TestNG_WORKSPACE 中建立一個名為 SampleTest.java 的 Java 類檔案。

import org.testng.Assert;
import org.testng.annotations.Test;

public class SampleTest {
	
   String message = "Hello World";
   MessageUtil messageUtil = new MessageUtil(message);

   @Test
   public void testPrintMessage() {
      Assert.assertEquals(message, messageUtil.printMessage());
   }
}

建立 testng.xml

接下來,讓我們在 C:\>TestNG_WORKSPACE 中建立 testng.xml 檔案來執行測試用例。此檔案以 XML 格式捕獲你的所有測試。此檔案使您可以輕鬆地在單個檔案中描述所有測試套件及其引數,您可以將其檢入程式碼儲存庫或透過電子郵件傳送給同事。它還可以輕鬆提取測試子集或拆分多個執行時配置(例如,testngdatabase.xml 將僅執行測試你的資料庫的測試)。

<?xml version = "1.0" encoding = "UTF-8"?>

<suite name = "Sample test Suite">
   <test name = "Sample test">
      <classes>
         <class name = "SampleTest" />
      </classes>
   </test>
</suite>	

使用 javac 編譯測試用例。

C:\TestNG_WORKSPACE>javac MessageUtil.java SampleTest.java 

現在,執行 testng.xml,它將執行在 <test> 標籤中定義的測試用例。

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。

Hello World

===============================================
Sample test Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================

TestNG - 套件測試

測試套件是旨在測試軟體程式行為或一組行為的測試用例的集合。在 TestNG 中,我們不能在測試原始碼中定義套件,但它由一個 XML 檔案表示,因為套件是執行的特性。它還允許靈活配置要執行的測試。一個套件可以包含一個或多個測試,並由 <suite> 標籤定義。

<suite> 是 testng.xml 的根標籤。它描述一個測試套件,該套件又由幾個 <test> 部分組成。

下表列出了 <suite> 接受的所有合法屬性。

序號 屬性 & 描述
1

name

此套件的名稱。這是一個必填屬性。

2

verbose

此執行的級別或詳細程度。

3

parallel

TestNG 是否應該執行不同的執行緒來執行此套件。

4

thread-count

如果啟用了並行模式,則要使用的執行緒數(否則忽略)。

5

annotations

你在測試中使用的註解型別。

6

time-out

將用於此測試中找到的所有測試方法的預設超時時間。

在本章中,我們將向你展示一個包含兩個測試類 Test1 & Test2 的示例,以便使用測試套件一起執行。

建立類

建立一個要測試的 Java 類,例如,在 C:\>JUNIT_WORKSPACE 中建立 MessageUtil.java

/*
* This class prints the given message on console.
*/

public class MessageUtil {
   private String message;

   // Constructor
   // @param message to be printed
   public MessageUtil(String message) {
      this.message = message;
   }

   // prints the message
   public String printMessage() {
      System.out.println(message);
      return message;
   }

   // add "Hi!" to the message
   public String salutationMessage() {
      message = "Hi!" + message;
      System.out.println(message);
      return message;
   }
}

建立測試用例類

C:\>TestNG_WORKSPACE 中建立一個名為 Test1.java 的 Java 類檔案。

import org.testng.Assert;
import org.testng.annotations.Test;

public class Test1 {
   String message = "Manisha";
   MessageUtil messageUtil = new MessageUtil(message);

   @Test
   public void testPrintMessage() {
      System.out.println("Inside testPrintMessage()");
      Assert.assertEquals(message, messageUtil.printMessage());
   }
}

C:\>TestNG_WORKSPACE 中建立一個名為 Test2.java 的 Java 類檔案。

import org.testng.Assert;
import org.testng.annotations.Test;

public class Test2 {
   String message = "Manisha";	
   MessageUtil messageUtil = new MessageUtil(message);
	 
   @Test
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Manisha";
      Assert.assertEquals(message,messageUtil.salutationMessage());
   }
}

現在,讓我們在 C:\>TestNG_WORKSPACE 中編寫 testng.xml,它將包含如下 <suite> 標籤:

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">

   <test name = "exampletest1">
      <classes>
         <class name = "Test1" />
      </classes>
   </test>
  
   <test name = "exampletest2">
      <classes>
         <class name = "Test2" />
      </classes>
   </test>
  
</suite>  	

Suite1 包含 exampletest1exampletest2

使用 javac 編譯所有 Java 類。

C:\TestNG_WORKSPACE>javac MessageUtil.java Test1.java Test2.java

現在,執行 testng.xml,它將執行在提供的測試用例類中定義的測試用例。

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。

Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha

===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================

你還可以檢查 test-output 資料夾。在 Suite1 資料夾下,你可以看到建立的兩個 html 檔案,exampletest1.html 和 exampletest2.html,它們看起來如下:

Writing Tests

Writing Tests

TestNG - 忽略測試

有時,我們的程式碼可能尚未準備好,並且編寫用於測試該方法/程式碼的測試用例失敗。在這種情況下,註解 @Test(enabled = false) 有助於停用此測試用例。

如果測試方法用 @Test(enabled = false) 註解,則將繞過尚未準備好測試的測試用例。

現在,讓我們看看 @Test(enabled = false) 的實際操作。

建立類

建立一個要測試的 Java 類,例如,在 C:\>TestNG_WORKSPACE 中建立 MessageUtil.java

/*
* This class prints the given message on console.
*/

public class MessageUtil {

   private String message;

   //Constructor
   //@param message to be printed
   public MessageUtil(String message) {
      this.message = message; 
   }

   // prints the message
   public String printMessage() {
      System.out.println(message);
      return message;
   }   

   // add "Hi!" to the message
   public String salutationMessage() {
      message = "Hi!" + message;
      System.out.println(message);
      return message;
   }   
}  

建立測試用例類

  • 建立一個 Java 測試類,例如,IgnoreTest.java

  • 向你的測試類中新增測試方法 testPrintMessage() 和 testSalutationMessage()。

  • 向 testPrintMessage() 方法添加註解 @Test(enabled = false)。

C:\>TestNG_WORKSPACE 中建立一個名為 IgnoreTest.java 的 Java 類檔案。

import org.testng.Assert;
import org.testng.annotations.Test;

public class IgnoreTest {
   String message = "Manisha";
   MessageUtil messageUtil = new MessageUtil(message);

   @Test(enabled = false)
   public void testPrintMessage() {
      System.out.println("Inside testPrintMessage()");
      message = "Manisha";
      Assert.assertEquals(message, messageUtil.printMessage());
   }

   @Test
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Manisha";
      Assert.assertEquals(message, messageUtil.salutationMessage());
   }
}

建立 testng.xml

C:\>TestNG_WORKSPACE 中建立 testng.xml 來執行測試用例。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "IgnoreTest" />
      </classes>
   </test>
</suite>	

使用 javac 編譯 MessageUtil 和測試用例類。

C:\TestNG_WORKSPACE>javac MessageUtil.java IgnoreTest.java

現在,執行 testng.xml,它將不會執行在提供的測試用例類中定義的 testPrintMessage() 測試用例。

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。testPrintMessage() 測試用例未被測試。

Inside testSalutationMessage()
Hi!Manisha

===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================

你還可以忽略一組測試,這將在下一章中討論。

TestNG - 組測試

組測試是 TestNG 中一項新的創新功能,JUnit 框架中不存在此功能。它允許你將方法分配到適當的部分並執行測試方法的複雜分組。

你不僅可以宣告屬於組的方法,還可以指定包含其他組的組。然後,可以呼叫 TestNG 並要求它包含一組特定的組(或正則表示式),同時排除另一組。

組測試在如何劃分測試方面提供了最大的靈活性,並且如果要連續執行兩組不同的測試,則不需要重新編譯任何內容。

組是在你的 testng.xml 檔案中使用 <groups> 標籤指定的。它可以在 <test> 或 <suite> 標籤下找到。在 <suite> 標籤中指定的組適用於下面的所有 <test> 標籤。

現在,讓我們來看一個例子,看看組測試是如何工作的。

建立類

建立一個要測試的 Java 類,例如,在 C:\> TestNG_WORKSPACE 中建立 MessageUtil.java

/*
* This class prints the given message on console.
*/
public class MessageUtil {
   private String message;

   // Constructor
   // @param message to be printed
   public MessageUtil(String message) {
      this.message = message;
   }

   // prints the message
   public String printMessage() {
      System.out.println(message);
      return message;
   }

   // add "tutorialspoint" to the message
   public String salutationMessage() {
      message = "tutorialspoint" + message;
      System.out.println(message);
      return message;
   }

   // add "www." to the message
   public String exitMessage() {
      message = "www." + message;
      System.out.println(message);
      return message;
   }
}

建立測試用例類

  • 建立一個 Java 測試類,例如,GroupTestExample.java。

  • 向你的測試類中新增測試方法 testPrintMessage() 和 testSalutationMessage()。

  • 將測試方法分成兩類:

    • 簽入測試 (checkintest) - 這些測試應該在你提交新程式碼之前執行。它們通常應該很快,並且只確保沒有基本功能被破壞。

    • 功能測試 (functest) - 這些測試應該涵蓋你軟體的所有功能,並且至少應該每天執行一次,儘管理想情況下你希望連續執行它們。

C:\>TestNG_WORKSPACE 中建立名為 GroupTestExample.java 的 Java 類檔案。

import org.testng.Assert;
import org.testng.annotations.Test;

public class GroupTestExample {
   String message = ".com";
   MessageUtil messageUtil = new MessageUtil(message);

   @Test(groups = { "functest", "checkintest" })
   
   public void testPrintMessage() {
      System.out.println("Inside testPrintMessage()");
      message = ".com";
      Assert.assertEquals(message, messageUtil.printMessage());
   }

   @Test(groups = { "checkintest" })
   
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "tutorialspoint" + ".com";
      Assert.assertEquals(message, messageUtil.salutationMessage());
   }

   @Test(groups = { "functest" })
   
   public void testingExitMessage() {
      System.out.println("Inside testExitMessage()");
      message = "www." + "tutorialspoint"+".com";
      Assert.assertEquals(message, messageUtil.exitMessage());
   }  
}

建立 testng.xml

C:\> TestNG_WORKSPACE 中建立 testng.xml 來執行測試用例。在這裡,我們將只執行屬於 functest 組的那些測試。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
   
      <groups>
         <run>
            <include name = "functest" />
         </run>
      </groups>

      <classes>
         <class name = "GroupTestExample" />
      </classes>
   
   </test>
</suite>

使用 javac 編譯 MessageUtil 和測試用例類。

C:\TestNG_WORKSPACE>javac MessageUtil.java GroupTestExample.java

現在,執行 testng.xml,它將只執行 testPrintMessage() 方法,因為它屬於 functest 組。

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。只執行了 testPrintMessage() 方法。

Inside testPrintMessage()
.com
Inside testExitMessage()
www..com

===============================================
Suite1
Total tests run: 2, Failures: 1, Skips: 0
===============================================

組的組

組還可以包含其他組。這些組稱為元組。例如,你可能想要定義一個包含 checkintest 和 functest 的組 all。讓我們修改我們的 testng.xml 檔案如下:

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
   <test name = "test1">
   
      <groups>
      
         <define name = "all">
            <include name = "functest"/>
            <include name = "checkintest"/>
         </define>
         
         <run>
            <include name = "all"/>
         </run>
         
      </groups>
      
      <classes>
         <class name = "GroupTestExample" />
      </classes>
      
   </test>
</suite>

執行上面的 testng.xml 將執行所有三個測試,並將給你以下結果:

Inside testPrintMessage()
.com
Inside testSalutationMessage()
tutorialspoint.com
Inside testExitMessage()
www.tutorialspoint.com

===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================

排除組

你可以使用 <exclude> 標籤忽略一個組,如下所示:

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
   <test name = "test1">

      <groups>
         <define name = "all">
            <exclude name = "functest"/>
            <include name = "checkintest"/>
         </define>

         <run>
            <include name = "all"/>
         </run>
      </groups>

      <classes>
         <class name = "GroupTestExample" />
      </classes>

   </test>
</suite>

TestNG - 異常測試

TestNG 提供了一個跟蹤程式碼異常處理的選項。你可以測試程式碼是否丟擲所需的異常。這裡 expectedExceptions 引數與 @Test 註解一起使用。現在,讓我們看看 @Test(expectedExceptions) 的實際操作。

建立類

建立一個要測試的 Java 類,例如,在 C:\> TestNG_WORKSPACE 中建立 MessageUtil.java。在 printMessage() 方法中新增一個錯誤條件。

/*
* This class prints the given message on console.
*/
public class MessageUtil {

   private String message;

   //Constructor
   //@param message to be printed
   public MessageUtil(String message) {
      this.message = message; 
   }

   // prints the message
   public void printMessage() {
      System.out.println(message);
      int a =0;
      int b = 1/a;
   }   

   // add "Hi!" to the message
   public String salutationMessage() {
      message = "Hi!" + message;
      System.out.println(message);
      return message;
   }   
}  	

建立測試用例類

  • 建立一個 Java 測試類,例如,ExpectedExceptionTest.java

  • 向 testPrintMessage() 測試用例新增預期的異常 ArithmeticException。

C:\> TestNG_WORKSPACE 中建立一個名為 ExpectedExceptionTest.java 的 Java 類檔案。

import org.testng.Assert;
import org.testng.annotations.Test;

public class ExpectedExceptionTest {
   String message = "Manisha";	
   MessageUtil messageUtil = new MessageUtil(message);
	   
   @Test(expectedExceptions = ArithmeticException.class)
   public void testPrintMessage() {	
      System.out.println("Inside testPrintMessage()");     
      messageUtil.printMessage();     
   }
   
   @Test
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Manisha";
      Assert.assertEquals(message,messageUtil.salutationMessage());
   }
}

建立測試執行器

C:\>TestNG_WORKSPACE 中建立 testng.xml 來執行測試用例。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "ExpectedExceptionTest" />
      </classes>
   </test>
</suite>	

使用 javac 編譯 MessageUtil 和測試用例類。

C:\TestNG_WORKSPACE>javac MessageUtil.java TestJunit.java

現在,執行測試執行器,它將執行在提供的測試用例類中定義的測試用例。

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。testPrintMessage() 測試用例將透過。

Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha

===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================

TestNG - 依賴測試

有時,你可能需要按特定順序在測試用例中呼叫方法,或者你可能想要在方法之間共享一些資料和狀態。TestNG 支援這種依賴關係,因為它支援在測試方法之間宣告顯式依賴關係。

TestNG 允許你使用以下方法指定依賴關係:

  • 在 @Test 註解中使用屬性 dependsOnMethods,或者。

  • 在 @Test 註解中使用屬性 dependsOnGroups

使用 dependsOnMethods 的示例

建立類

建立一個要測試的 Java 類,例如,在 C:\>TestNG_WORKSPACE 中建立 MessageUtil.java

public class MessageUtil {
   private String message;

   // Constructor
   // @param message to be printed
   public MessageUtil(String message) {
      this.message = message;
   }

   // prints the message
   public String printMessage() {
      System.out.println(message);
      return message;
   }

   // add "Hi!" to the message
   public String salutationMessage() {
      message = "Hi!" + message;
      System.out.println(message);
      return message;
   }
}

建立測試用例類

  • 建立一個 Java 測試類,例如,DependencyTestUsingAnnotation.java。

  • 向你的測試類中新增測試方法 testPrintMessage()、testSalutationMessage() 和 initEnvironmentTest()。

  • testSalutationMessage() 方法的 @Test 註解中新增屬性 dependsOnMethods = {"initEnvironmentTest"}

C:\>TestNG_WORKSPACE 中建立一個名為 DependencyTestUsingAnnotation.java 的 Java 類檔案。

import org.testng.Assert;
import org.testng.annotations.Test;

public class DependencyTestUsingAnnotation {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);

   @Test
   public void testPrintMessage() {
      System.out.println("Inside testPrintMessage()");
      message = "Manisha";
      Assert.assertEquals(message, messageUtil.printMessage());
   }

   @Test(dependsOnMethods = { "initEnvironmentTest" })
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Manisha";
      Assert.assertEquals(message, messageUtil.salutationMessage());
   }

   @Test
   public void initEnvironmentTest() {
      System.out.println("This is initEnvironmentTest");
   }
}

建立 testng.xml

C:\>TestNG_WORKSPACE 中建立 testng.xml 來執行測試用例。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "DependencyTestUsingAnnotation" />
      </classes>
   </test>
</suite>

使用 javac 編譯 MessageUtil 和測試用例類。

C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java

現在,執行 testng.xml,它將僅在執行 initEnvironmentTest() 方法後執行 testSalutationMessage() 方法。

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。

This is initEnvironmentTest
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha

===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================

使用 dependsOnGroups 的示例

你還可以擁有依賴於整個組的方法。讓我們舉個例子來演示這一點。

建立類

建立一個要測試的 Java 類,例如,在 C:\>TestNG_WORKSPACE 中建立 MessageUtil.java

public class MessageUtil {
   private String message;

   // Constructor
   // @param message to be printed
   public MessageUtil(String message) {
      this.message = message;
   }

   // prints the message
   public String printMessage() {
      System.out.println(message);
      return message;
   }

   // add "Hi!" to the message
   public String salutationMessage() {
      message = "Hi!" + message;
      System.out.println(message);
      return message;
   }
}

建立測試用例類

  • 建立一個 Java 測試類,例如,DependencyTestUsingAnnotation.java。

  • 向你的測試類中新增測試方法 testPrintMessage()、testSalutationMessage() 和 initEnvironmentTest(),並將它們新增到組“init”。

  • testSalutationMessage() 方法的 @Test 註解中新增屬性 dependsOnMethods = {"init.*"}

C:\>TestNG_WORKSPACE 中建立一個名為 DependencyTestUsingAnnotation.java 的 Java 類檔案。

import org.testng.Assert;
import org.testng.annotations.Test;

public class DependencyTestUsingAnnotation {
   String message = "Manisha";
   MessageUtil messageUtil = new MessageUtil(message);

   @Test(groups = { "init" })
   public void testPrintMessage() {
      System.out.println("Inside testPrintMessage()");
      message = "Manisha";
      Assert.assertEquals(message, messageUtil.printMessage());
   }

   @Test(dependsOnGroups = { "init.*" })
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Manisha";
      Assert.assertEquals(message, messageUtil.salutationMessage());
   }

   @Test(groups = { "init" })
   public void initEnvironmentTest() {
      System.out.println("This is initEnvironmentTest");
   }
}

在這個例子中,testSalutationMessage() 方法宣告依賴於任何匹配正則表示式 "init.*" 的組,這保證了 testPrintMessage() 和 initEnvironmentTest() 方法總會在 testSalutationMessage() 方法之前被呼叫。

如果一個被依賴的方法失敗,並且你對其存在硬依賴 (alwaysRun=false,這是預設值),那麼依賴它的方法不會標記為 FAIL,而是 SKIP。跳過的 (SKIP) 方法會在最終報告中被這樣報告(在 HTML 中顯示為既不是紅色也不是綠色的顏色),這一點很重要,因為跳過的 (SKIP) 方法不一定是失敗。

建立 testng.xml

C:\>TestNG_WORKSPACE 中建立 testng.xml 來執行測試用例。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "DependencyTestUsingAnnotation" />
      </classes>
   </test>
</suite>

使用 javac 編譯 MessageUtil 和測試用例類。

C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java

現在,執行 testng.xml,它將僅在 initEnvironmentTest() 方法執行之後執行 testSalutationMessage() 方法。

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。

This is initEnvironmentTest
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha

===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================

dependsOnGroupsdependsOnMethods

  • 使用組後,我們不再受重構問題的影響。只要我們不修改 dependsOnGroups 或 groups 屬性,我們的測試將繼續以正確的依賴關係設定執行。

  • 每當需要在依賴關係圖中新增新方法時,我們只需要將其放入正確的組中,並確保它依賴於正確的組即可。我們不需要修改任何其他方法。

TestNG - 引數化測試

TestNG 的另一個有趣特性是 **引數化測試**。在大多數情況下,你會遇到業務邏輯需要大量不同測試的場景。**引數化測試** 允許開發人員使用不同的值反覆執行相同的測試。

TestNG 允許你透過兩種不同的方式直接將引數傳遞給你的測試方法:

  • 使用 testng.xml
  • 使用資料提供者 (Data Providers)

使用 testng.xml 傳遞引數

使用此技術,你可以在 testng.xml 檔案中定義簡單的引數,然後在原始檔中引用這些引數。讓我們來看一個例子來演示如何使用此技術傳遞引數。

建立測試用例類

  • 建立一個 Java 測試類,例如 ParameterizedTest1.java。

  • 向你的測試類新增測試方法 parameterTest()。此方法接受一個字串作為輸入引數。

  • 向此方法添加註解 @Parameters("myName")。該引數將從 testng.xml 中傳遞一個值,我們將在下一步中看到。

C:\>TestNG_WORKSPACE 中建立一個名為 ParameterizedTest1.java 的 Java 類檔案。

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class ParameterizedTest1 {
   @Test
   @Parameters("myName")
   public void parameterTest(String myName) {
      System.out.println("Parameterized value is : " + myName);
   }
}

建立 testng.xml

C:\>TestNG_WORKSPACE 中建立 testng.xml 來執行測試用例。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
   
      <parameter name = "myName" value="manisha"/> 
      
      <classes>
         <class name = "ParameterizedTest1" />
      </classes>
      
   </test>
</suite>

我們也可以在 <suite> 級別定義引數。假設我們在 <suite> 和 <test> 級別都定義了 myName。在這種情況下,將應用常規作用域規則。這意味著 <test> 標記內的任何類都將看到在 <test> 中定義的引數值,而 testng.xml 檔案中其餘部分的類將看到在 <suite> 中定義的值。

使用 javac 編譯測試用例類。

C:\TestNG_WORKSPACE>javac ParameterizedTest1.java

現在,執行 testng.xml,它將執行 parameterTest 方法。TestNG 將首先嚐試在 <test> 標記中查詢名為 myName 的引數,如果找不到,則在包含它的 <suit> 標記中搜索。

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。

Parameterized value is : manisha

===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================

TestNG 將自動嘗試將 testng.xml 中指定的值轉換為你的引數型別。以下是支援的型別:

  • String
  • int/Integer
  • boolean/Boolean
  • byte/Byte
  • char/Character
  • double/Double
  • float/Float
  • long/Long
  • short/Short

使用 資料提供者 (Dataproviders) 傳遞引數

當你需要傳遞複雜引數或需要從 Java 建立的引數(複雜物件、從屬性檔案或資料庫讀取的物件等)時,可以使用資料提供者 (Dataproviders) 傳遞引數。

資料提供者 (Data Provider) 是使用 @DataProvider 註解的方法。此註解只有一個字串屬性:它的名稱。如果未提供名稱,則資料提供者的名稱將自動預設為方法的名稱。資料提供者返回一個物件陣列。

以下示例演示如何使用資料提供者。第一個示例是關於使用 Vector、String 或 Integer 作為引數的 @DataProvider,第二個示例是關於使用物件作為引數的 @DataProvider。

示例 1

在這裡,@DataProvider 傳遞 Integer 和 Boolean 作為引數。

建立 Java 類

建立一個名為 PrimeNumberChecker.java 的 Java 類。此類檢查數字是否為素數。在 C:\>TestNG_WORKSPACE 中建立此類。

public class PrimeNumberChecker {
   public Boolean validate(final Integer primeNumber) {
   
      for (int i = 2; i < (primeNumber / 2); i++) {
         if (primeNumber % i == 0) {
            return false;
         }
      }
      return true;
   }
}

建立測試用例類

  • 建立一個 Java 測試類,例如 ParamTestWithDataProvider1.java。

  • 定義方法 primeNumbers(),該方法使用註解定義為資料提供者。此方法返回一個物件陣列。

  • 向你的測試類新增測試方法 testPrimeNumberChecker()。此方法接受 Integer 和 Boolean 作為輸入引數。此方法驗證傳遞的引數是否為素數。

  • 向此方法添加註解 @Test(dataProvider = "test1")。dataProvider 屬性對映到 "test1"。

C:\>TestNG_WORKSPACE 中建立一個名為 ParamTestWithDataProvider1.java 的 Java 類檔案。

import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParamTestWithDataProvider1 {
   private PrimeNumberChecker primeNumberChecker;

   @BeforeMethod
   public void initialize() {
      primeNumberChecker = new PrimeNumberChecker();
   }

   @DataProvider(name = "test1")
   public static Object[][] primeNumbers() {
      return new Object[][] {{2, true}, {6, false}, {19, true}, {22, false}, {23, true}};
   }

   // This test will run 4 times since we have 5 parameters defined
   @Test(dataProvider = "test1")
   public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) {
      System.out.println(inputNumber + " " + expectedResult);
      Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber));
   }
}

建立 testng.xml

C:\>TestNG_WORKSPACE 中建立一個 testng.xml 來執行測試用例。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "ParamTestWithDataProvider1" />
      </classes>
   </test>
</suite>

使用 javac 編譯測試用例類。

C:\TestNG_WORKSPACE>.javac ParamTestWithDataProvider1.java PrimeNumberChecker.java

現在,執行 testng.xml。

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。

   2 true
   6 false
   19 true
   22 false
   23 true

===============================================
   Suite1
   Total tests run: 5, Failures: 0, Skips: 0
===============================================

示例 2

在這裡,@DataProvider 傳遞 Object 作為引數。

建立 Java 類

建立一個 Java 類 Bean.java,它是一個帶有 get/set 方法的簡單物件,在 C:\>TestNG_WORKSPACE 中建立。

public class Bean {
   private String val;
   private int i;
   
   public Bean(String val, int i) {
      this.val = val;
      this.i = i;
   }
   
   public String getVal() {
      return val;
   }
   
   public void setVal(String val) {
      this.val = val;
   }
   
   public int getI() {
      return i;
   }
   
   public void setI(int i) {
      this.i = i;
   }
}

建立測試用例類

  • 建立一個 Java 測試類,例如 ParamTestWithDataProvider2.java。

  • 定義方法 primeNumbers(),該方法使用註解定義為資料提供者。此方法返回一個物件陣列。

  • 向你的測試類新增測試方法 testMethod()。此方法接受一個物件 bean 作為引數。

  • 向此方法添加註解 @Test(dataProvider = "test1")。dataProvider 屬性對映到 "test1"。

C:\>TestNG_WORKSPACE 中建立一個名為 ParamTestWithDataProvider2.java 的 Java 類檔案。

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParamTestWithDataProvider2 {
   @DataProvider(name = "test1")
   public static Object[][] primeNumbers() {
      return new Object[][] { { new Bean("hi I am the bean", 111) } };
   }

   @Test(dataProvider = "test1")
   public void testMethod(Bean myBean) {
      System.out.println(myBean.getVal() + " " + myBean.getI());
   }
}

建立 testng.xml

C:\>TestNG_WORKSPACE 中建立 testng.xml 來執行測試用例。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "ParamTestWithDataProvider2" />
      </classes>
   </test>
</suite>

使用 javac 編譯測試用例類。

C:\TestNG_WORKSPACE>javac ParamTestWithDataProvider2.java Bean.java

現在,執行 testng.xml。

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。

   hi I am the bean 111

===============================================
   Suite1
   Total tests run: 1, Failures: 0, Skips: 0
===============================================

TestNG - 執行 Junit 測試

既然你已經瞭解了 TestNG 及其各種測試,你可能現在擔心如何重構現有的 JUnit 程式碼。不用擔心,TestNG 提供了一種以你自己的速度從 JUnit 切換到 TestNG 的方法。你可以使用 TestNG 執行現有的 JUnit 測試用例。

TestNG 可以自動識別並執行 JUnit 測試,這樣你就可以使用 TestNG 作為所有現有測試的執行器,並使用 TestNG 編寫新的測試。你只需要將 JUnit 庫放在 TestNG 類路徑上,以便它可以查詢並使用 JUnit 類,在 Ant 中將你的測試執行器從 JUnit 更改為 TestNG,然後以“混合”模式執行 TestNG。這樣,你就可以在同一個專案中,甚至同一個包中擁有所有測試,並開始使用 TestNG。這種方法還允許你逐步將現有的 JUnit 測試轉換為 TestNG。

讓我們來看一個例子來演示 TestNG 的這個驚人功能。

建立 JUnit 測試用例類

建立一個 Java 類,它是一個 JUnit 測試類,TestJunit.java,在 C:\>TestNG_WORKSPACE 中建立。

import org.junit.Test;
import static org.testng.AssertJUnit.assertEquals;

public class TestJunit {
   @Test
   public void testAdd() {
      String str = "Junit testing using TestNG";
      AssertEquals("Junit testing using TestNG",str);
   }
}

現在,讓我們在 C:\>TestNG_WORKSPACE 中編寫 testng.xml,它將包含如下 <suite> 標籤:

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name = "Converted JUnit suite" >
   <test name = "JUnitTests" junit="true">
      <classes>
         <class name = "TestJunit" />
      </classes>
   </test>
</suite>
  	

要執行 JUnit 測試用例,請定義屬性 junit="true",如上面的 xml 中所示。JUnit 測試用例類 TestJunit 在類名中定義。

對於 JUnit 4,TestNG 將使用 org.junit.runner.JUnitCore 執行器來執行你的測試。

使用 javac 編譯所有 Java 類。

C:\TestNG_WORKSPACE>javac TestJunit.java

現在,執行 testng.xml,它將作為 TestNG 執行 JUnit 測試用例。

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE:C:\TestNG_WORKSPACE\lib\junit-4.11.jar" org.testng.TestNG testng.xml

這裡,我們將 junit-4.11.jar 放置在 C:\TestNG_WORKSPACE\lib\junit-4.11.jar 下。

驗證輸出。

===============================================
   Converted JUnit suite

   Total tests run: 1, Failures: 0, Skips: 0
===============================================

TestNG - 測試結果

報告是任何測試執行中最重要的部分,因為它可以幫助使用者瞭解測試執行的結果、失敗點以及失敗的原因。另一方面,日誌記錄對於關注執行流程或在出現任何故障時進行除錯非常重要。

TestNG 預設情況下會為其測試執行生成不同型別的報告。這包括 HTML 和 XML 報告輸出。TestNG 還允許使用者編寫自己的報告程式並在 TestNG 中使用它。還有一個選項可以編寫你自己的日誌記錄器,這些日誌記錄器會在 TestNG 的執行時被通知。

有兩種方法可以使用 TestNG 生成報告:

  • 監聽器 (Listeners) - 對於實現監聽器類,該類必須實現 org.testng.ITestListener 介面。當測試啟動、完成、失敗、跳過或透過時,TestNG 會在執行時通知這些類。

  • 報告程式 (Reporters) - 對於實現報告類,該類必須實現 org.testng.IReporter 介面。當整個套件執行結束時,會呼叫這些類。包含整個測試執行資訊的類會在呼叫時傳遞給此類。

在本章中,我們將有四個不同的例子來演示四種不同的報告和日誌記錄情況:

序號 案例和示例
1 自定義日誌記錄

此示例說明如何編寫你自己的日誌記錄器。

2 自定義報告程式

此示例說明如何編寫你自己的報告程式。

3 HTML 和 XML 報告

此示例說明 TestNG 生成的預設 HTML 和 XML 報告。

4 JUnit 報告

此示例說明如何從 TestNG 報告生成 JUnit 報告。

TestNG - 與 ANT 整合

在本章中,我們將演示如何使用 ANT 執行 TestNG。讓我們按照以下步驟操作:

步驟 1:下載 Apache Ant

下載最新版本的 Apache Ant

作業系統 壓縮包名稱
Windows apache-ant-1.8.4-bin.zip
Linux apache-ant-1.8.4-bin.tar.gz
Mac apache-ant-1.8.4-bin.tar.gz

步驟 2:設定 Ant 環境

設定 **ANT_HOME** 環境變數,指向 ANT 庫在你的計算機上儲存的基本目錄位置。讓我們假設我們將 Ant 庫儲存在 apache-ant-1.8.4 資料夾中。

作業系統 輸出
Windows 將環境變數 ANT_HOME 設定為 C:\Program Files\Apache Software Foundation\apache-ant-1.8.4
Linux Export ANT_HOME=/usr/local/apache-ant-1.8.4
Mac Export ANT_HOME=/Library/apache-ant-1.8.4

將 Ant 編譯器位置新增到系統路徑,如下所示:

作業系統 說明
Windows 在系統變數 Path 的末尾新增字串 %ANT_HOME\bin。
Linux Export PATH=$PATH:$ANT_HOME/bin/
Mac 不需要。

步驟 3:下載 TestNG 歸檔檔案

下載所需的 jar 檔案 http://www.testng.org

作業系統 歸檔檔名
Windows testng-6.8.jar
Linux testng-6.8.jar
Mac testng-6.8.jar

步驟 4:建立專案結構

  • C:\>TestNG_WORKSPACE 中建立一個名為 TestNGWithAnt 的資料夾。

  • C:\>TestNG_WORKSPACE>TestNGWithAnt 中建立一個名為 src 的資料夾。

  • C:\>TestNG_WORKSPACE>TestNGWithAnt 中建立一個名為 test 的資料夾。

  • C:\>TestNG_WORKSPACE>TestNGWithAnt 中建立一個名為 lib 的資料夾。

  • C:\>TestNG_WORKSPACE>TestNGWithAnt>src 資料夾中建立 MessageUtil 類。

/*
* This class prints the given message on console.
*/

public class MessageUtil {

   private String message;

   //Constructor
   //@param message to be printed
   public MessageUtil(String message) {
      this.message = message; 
   }

   // prints the message
   public void printMessage() {
      System.out.println(message);
      return message;
   }   

   // add "Hi!" to the message
   public String salutationMessage() {
      message = "Hi!" + message;
      System.out.println(message);
      return message;
   }   
}  	
  • C:\>TestNG_WORKSPACE>TestNGWithAnt>src 資料夾中建立 TestMessageUtil 類。

import org.testng.Assert;
import org.testng.annotations.Test;


public class TestMessageUtil {
   String message = "Manisha";	
   MessageUtil messageUtil = new MessageUtil(message);

   @Test
   public void testPrintMessage() {	
      System.out.println("Inside testPrintMessage()");     
      Assert.assertEquals(message,messageUtil.printMessage());
   }

   @Test
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Manisha";
      Assert.assertEquals(message,messageUtil.salutationMessage());
   }
}
  • 將 testng-6.8.jar 複製到 C:\>TestNG_WORKSPACE>TestNGWithAnt>lib 資料夾。

建立 ANT build.xml

首先,我們需要定義 TestNG Ant 任務,如下所示:

<taskdef name = "testng" classname = "org.testng.TestNGAntTask">
   <classpath>
      <pathelement location = "lib/testng-6.8.jar"/>
   </classpath>
</taskdef>

然後,我們將在 Ant 中使用 <testng> 任務來執行我們的 TestNG 測試用例。

build.xml 檔案如下:

<project name = "TestNGTest" default = "test" basedir = ".">

   <!-- Define <testng> task -->

   <taskdef name = "testng" classname = "org.testng.TestNGAntTask">
      <classpath>
         <pathelement location = "lib/testng-6.8.jar"/>
      </classpath>
   </taskdef>

   <property name = "testdir" location = "test" />
   <property name = "srcdir" location = "src" />
   <property name = "libdir" location = "lib" />
   <property name = "full-compile" value="true" />
   
   <path id = "classpath.base"/>
   <path id = "classpath.test">
   
   <fileset dir = "${libdir}">
      <include name = "**/*.jar" />
   </fileset>
   
   <pathelement location = "${testdir}" />
   <pathelement location = "${srcdir}" />
   
   <path refid = "classpath.base" />
   </path>
   
   <target name = "clean" >
      <delete verbose="${full-compile}">
         <fileset dir = "${testdir}" includes="**/*.class" />
      </delete>
   </target>
   
   <target name = "compile" depends="clean">
      <javac srcdir = "${srcdir}" destdir = "${testdir}" verbose="${full-compile}">
         <classpath refid = "classpath.test"/>
      </javac>
   </target>
   
   <target name = "test" depends="compile">
      <testng outputdir = "${testdir}" classpathref="classpath.test"> 
         <xmlfileset dir = "${srcdir}" includes="testng.xml"/> 
      </testng>
   </target>
   
</project>

執行以下 Ant 命令。

C:\TestNG_WORKSPACE\TestNGWithAnt>ant

驗證輸出。

test:
   [testng] [TestNG] Running:
   [testng]   C:\TestNG_WORKSPACE\TestNGWithAnt\src\testng.xml
   [testng] 
   [testng] Inside testPrintMessage()
   [testng] Manisha
   [testng] Inside testSalutationMessage()
   [testng] Hi!Manisha
   [testng] 
   [testng] ===============================================
   [testng] Plug ANT test Suite
   [testng] Total tests run: 2, Failures: 0, Skips: 0
   [testng] ===============================================
   [testng] 

BUILD SUCCESSFUL
Total time: 1 second

TestNG - 與 Eclipse 整合

要將 TestNG 與 Eclipse 整合,請按照以下步驟操作:

步驟 1:下載 TestNG 壓縮包

http://www.testng.org 下載最新版本的 TestNG jar 檔案

作業系統 歸檔檔名
Windows testng-6.8.jar
Linux testng-6.8.jar
Mac testng-6.8.jar

我們假設你已將上述 JAR 檔案複製到 C:\>TestNG 資料夾。

步驟 2:設定 Eclipse 環境

  • 開啟 Eclipse → 右鍵單擊專案並轉到屬性 → 構建路徑 → 配置構建路徑,並使用 新增外部 JAR 按鈕將 testng-6.8.jar 新增到庫中。

Add testng-6.8.jar in liraries.
  • 我們假設你的 Eclipse 具有內建的 TestNG 外掛;如果不可用,請使用更新站點獲取最新版本。

    • 在你的 Eclipse IDE 中,選擇 幫助/軟體更新/查詢並安裝

    • 搜尋要安裝的新功能。

    • 新的遠端站點。

    • 確保選中 URL 旁邊的複選框,然後單擊 下一步

    • 然後,Eclipse 將指導你完成此過程。

現在,你的 Eclipse 已準備好開發 TestNG 測試用例。

步驟 3:驗證 Eclipse 中 TestNG 的安裝

  • 在 Eclipse 中的任何位置建立一個名為 TestNGProject 的專案。

  • 在專案中建立一個名為 MessageUtil 的類進行測試。

/*
* This class prints the given message on console.
*/

public class MessageUtil {

   private String message;

   //Constructor
   //@param message to be printed
   public MessageUtil(String message) {
      this.message = message;
   }

   // prints the message
   public String printMessage() {
      System.out.println(message);
      return message;
   }   
} 
  • 在專案中建立一個名為 TestNGExample 的測試類。

   
import org.testng.Assert;
import org.testng.annotations.Test;

public class TestNGExample {
   String message = "Hello World";	
   MessageUtil messageUtil = new MessageUtil(message);

   @Test
   public void testPrintMessage() {	  
      Assert.assertEquals(message,messageUtil.printMessage());
   }
}

專案結構應如下所示:

Project Structure

最後,透過右鍵單擊程式並將其作為 TestNG 執行來驗證程式的輸出。

驗證結果。

TestNG result success.
廣告
© . All rights reserved.