- TestNG 教程
- TestNG - 首頁
- TestNG - 概述
- TestNG - 環境
- TestNG - 編寫測試
- TestNG - 基本註解
- TestNG - 執行過程
- TestNG - 執行測試
- TestNG - 套件測試
- TestNG - 忽略測試
- TestNG - 組測試
- TestNG - 異常測試
- TestNG - 依賴測試
- TestNG - 引數化測試
- TestNG - 執行 JUnit 測試
- TestNG - 測試結果
- TestNG - 註解轉換器
- TestNG - 斷言
- TestNG - 並行執行
- TestNG - 與 ANT 整合
- TestNG - 與 Eclipse 整合
- TestNG - TestNG 與 JUnit 的比較
- TestNG 有用資源
- TestNG - 快速指南
- TestNG - 有用資源
- TestNG - 討論
TestNG - 引數化測試
TestNG 中另一個有趣的特性是引數化測試。在大多數情況下,您會遇到業務邏輯需要大量不同測試的場景。引數化測試允許開發人員使用不同的值一遍又一遍地執行相同的測試。
TestNG 允許您透過兩種不同的方式直接將引數傳遞給測試方法:
- 使用 testng.xml
- 使用資料提供者
使用testng.xml傳遞引數
使用此技術,您可以在testng.xml檔案中定義簡單的引數,然後在原始檔中引用這些引數。讓我們舉一個例子來演示如何使用此技術傳遞引數。
建立測試用例類
建立一個 Java 測試類,例如 ParameterizedTest1.java。
將測試方法 parameterTest() 新增到您的測試類中。此方法接受字串作為輸入引數。
將註解@Parameters("myName")新增到此方法。該引數將從 testng.xml 中傳遞一個值,我們將在下一步中看到。
在/work/testng/src中建立一個名為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
在/work/testng/src中建立 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 編譯測試用例類。
/work/testng/src$ javac ParameterizedTest1.java
現在,執行 testng.xml,它將執行parameterTest方法。TestNG 將首先嚐試在<test>標籤中找到名為myName的引數,如果找不到,則會在包含它的<suit>標籤中搜索。
/work/testng/src$ java org.testng.TestNG testng.xml
驗證輸出。
Parameterized value is : manisha =============================================== Suite1 Total tests run: 1, Failures: 0, Skips: 0 ===============================================
TestNG 將自動嘗試將 testng.xml 中指定的值轉換為引數的型別。以下是支援的型別:
- 字串
- int/Integer
- boolean/Boolean
- byte/Byte
- char/Character
- double/Double
- float/Float
- long/Long
- short/Short
使用Dataproviders傳遞引數
當您需要傳遞複雜引數或需要從 Java 建立的引數(複雜物件、從屬性檔案或資料庫讀取的物件等)時,可以使用資料提供者傳遞引數。
資料提供者是一個使用@DataProvider註解的方法。此註解只有一個字串屬性:它的名稱。如果未提供名稱,則資料提供者的名稱將自動預設為方法的名稱。資料提供者返回一個物件陣列。
以下示例演示瞭如何使用資料提供者。第一個示例是關於使用 Vector、String 或 Integer 作為引數的 @DataProvider,第二個示例是關於使用物件作為引數的 @DataProvider。
示例 1
這裡,@DataProvider 傳遞 Integer 和 Boolean 作為引數。
建立 Java 類
建立一個名為 PrimeNumberChecker.java 的 Java 類。此類檢查數字是否為素數。在/work/testng/src中建立此類。
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;
}
}
建立測試用例類
在/work/testng/src中建立一個 Java 測試類,例如ParamTestWithDataProvider1.java。
定義方法 primeNumbers(),該方法使用註解定義為資料提供者。此方法返回一個物件陣列。
將測試方法 testPrimeNumberChecker() 新增到您的測試類中。此方法接受 Integer 和 Boolean 作為輸入引數。此方法驗證傳遞的引數是否為素數。
將註解@Test(dataProvider = "test1")新增到此方法。屬性 dataProvider 對映到“test1”。
以下是ParamTestWithDataProvider1.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
建立 testng.xml /work/testng/src 來執行測試用例。
<?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 編譯測試用例類。
/work/testng/src$ javac ParamTestWithDataProvider1.java PrimeNumberChecker.java
現在,執行 testng.xml。
/work/testng/src$ java 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 類
在/work/testng/src中建立一個名為 Bean.java 的 Java 類,它是一個帶有 get/set 方法的簡單物件。
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”。
在/work/testng/src中建立一個名為 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
在/work/testng/src中建立 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 編譯測試用例類。
/work/testng/src$ javac ParamTestWithDataProvider2.java Bean.java
現在,執行 testng.xml。
/work/testng/src$ java org.testng.TestNG testng.xml
驗證輸出。
hi I am the bean 111 =============================================== Suite1 Total tests run: 1, Failures: 0, Skips: 0 ===============================================