日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
TestNG參數(shù)化測試實踐指南

審校 | 孫淑娟

專注于為中小企業(yè)提供成都網(wǎng)站設計、成都做網(wǎng)站服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)浉河免費做網(wǎng)站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉變。

參數(shù)化測試是TestNG的一個重要特性。 在很多情況下,我們會遇到業(yè)務邏輯需要大量測試的場景。 參數(shù)化測試允許我們使用不同的值一次又一次地運行相同的測試。

 本文介紹了TestNG 參數(shù)化注入的三種不同方式,并在此基礎上,介紹了測試代碼和測試數(shù)據(jù)、測試數(shù)據(jù)和測試環(huán)境的分離實踐以及一種利用Nacos將測試代碼和測試數(shù)據(jù)維護分離的有效實踐。另外,本文將會引導讀者完成一個實例,該示例將會較好地演示TestNG 參數(shù)的注入方式以及分離測試代碼、數(shù)據(jù)與環(huán)境的有效實踐。

示例項目準備

這里我們使用IDEA 社區(qū)版演示本實踐全過程,讀者也可以使用Eclipse和VSCode參考執(zhí)行,但筆者并不推薦。

填寫項目信息

Language選擇Java,Build system選擇Maven,JDK選擇1.8后,點“Create” 進入工程頁面。

pom.xml里加入dependency:


org.testng
testng
7.4.0
test

TestNG 參數(shù)化注入的方式

TestNG可以通過如下三種不同的方式將參數(shù)直接傳遞給測試方法:

  • 使用注解Parameters配合testng.xml
  • 使用注解Parameters配合-D命令行參數(shù)
  • 使用注解DataProvider

使用注解Parameters配合testng.xml

我們通過在testng.xml定義參數(shù),然后在代碼里面可以直接引用。我們先寫一個測試用例如下:

src/test/java/com/fastjrun.example/testng/ParameterizedTest1.java
package com.fastjrun.example.testng;

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如下:











執(zhí)行測試。

在testng.xml編輯窗口點擊鼠標右鍵彈出下拉菜單后,從中選擇“Run .../src/test/resources/testng.xml”即可執(zhí)行該單元測試用例。

執(zhí)行結果如下:

Parameterized value is : manisha

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

另外我們也可以如下圖所示,在ParameterizedTest1類編輯窗口選中需要測試的方法名parameterTest,點擊鼠標右鍵彈出下拉菜單后,從中選擇“Run parameterTest()”即可執(zhí)行該單元測試用例。

但通過如上方式運行單元測試,結果如下:

……
[Utils] [ERROR] [Error] org.testng.TestNGException:
Parameter 'myName' is required by @Test on method parameterTest but has not been marked @Optional or defined
in /Users/cuiyingfeng/Library/Caches/JetBrains/IdeaIC2022.1/temp-testng-customsuite.xml

顯然如上方式觸發(fā)的測試用例不能指定依賴的testng.xml,myName參數(shù)沒有被初始化,導致測試失敗。

使用testng.xml 執(zhí)行測試的方式適合對測試用例批量執(zhí)行的場景;如果我們在IDE中只想執(zhí)行某個具體的測試方法,還是需要從類中觸發(fā)測試方法的方式,也就是要通過非testng.xml配置的方式解決myName初始化的問題。

解決myName初始化問題的方法一共有兩種,其中一種是在測試方法parameterTest輸入?yún)?shù)前加@Optional注解,給myName一個默認的初始值如下:

package com.fastjrun.example.testng;

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

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

另外就是使用-D命令行參數(shù)。

使用注解Parameters配合-D命令行參數(shù)

使用-D命令行參數(shù)就是讓參數(shù)以系統(tǒng)參數(shù)的方式加載入JVM,該方式支持Java、Maven命令行執(zhí)行。idea配置-D命令行參數(shù)的方式如下:

使用注解DataProvider

我們先寫一個業(yè)務類PrimeNumberChecker如下所示,該類中只有一個方法validate,檢查輸入?yún)?shù)primeNumber是否為質數(shù),如果是返回True,如果不是返回False。

src/main/java/com/fastjrun.example/testng/PrimeNumberChecker.java
package com.fastjrun.example.testng;

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;
}
}

再寫一個測試類PrimeNumberCheckerTest:

  • 定義一個方法primeNumbers(), 該方法返回值是一個對象數(shù)組,該方法使用了注解DataProvider,其值為test1,方法體中只是簡單返回了一個新建的對象數(shù)據(jù)。
  • 新增一個方法 testPrimeNumberChecker(),該方法定義了兩個輸入?yún)?shù)整型變量inputNumber和布爾變量expectedResult。該方法體調用PrimeNumberChecker的validate方法,來驗證inputNumber為質數(shù)的結果是否為expectedResult。
  • 方法 testPrimeNumberChecker()其實是一個測試用例,該方法使用注解@Test(dataProvider = "test1"),表明該測試用例的dataProvider設置為test1,也就是說在執(zhí)行該測試用例的時候,會使用primeNumbers()返回的對象數(shù)組為該方法的輸入?yún)?shù)分別賦值。
src/test/java/com/fastjrun.example/testng/PrimeNumberCheckerTest.java
package com.fastjrun.example.testng;

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

public class PrimeNumberCheckerTest {
private PrimeNumberChecker primeNumberChecker;

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

@DataProvider(name = "test1")
public 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));
}
}

在PrimeNumberCheckerTest類編輯窗口選中需要測試的方法名testPrimeNumberChecker,點擊鼠標右鍵彈出下拉菜單后,從中選擇“Run testPrimeNumberChecker()”即可執(zhí)行該單元測試用例。

執(zhí)行結果如下:

2 true
6 false
19 true
22 false
23 true

===============================================
Default Suite
Total tests run: 5, Passes: 5, Failures: 0, Skips: 0
===============================================

從結果可以看出,該測試用例通過DataProvider一次性注入了5組測試數(shù)據(jù)。這種特性非常有助于我們在研發(fā)過程中采用TDD(測試驅動開發(fā))。關于TDD,并不是本文探討的內容,這里就不展開了。

TestNG 測試分離實踐

基于TestNG參數(shù)化注入的方式,我們可以很容易地做到測試代碼、數(shù)據(jù)與環(huán)境的相互分離;我們可以統(tǒng)一用文件來管理測試數(shù)據(jù),并能靈活地在不同測試環(huán)境切換不同的測試數(shù)據(jù);我們甚至可以將測試數(shù)據(jù)文件和測試用例代碼進一步分離,各自獨立維護,只有在具體執(zhí)行測試的時候才動態(tài)關聯(lián)。

測試代碼和測試數(shù)據(jù)分離實踐

從測試代碼中分離數(shù)據(jù),將數(shù)據(jù)集中寫在文件中,文件格式可以用txt、properties、yaml、json等,本文會采用properties格式來做示范,因為這個確實比較簡單;但具體到真實研發(fā)環(huán)境,筆者推薦yaml,yaml格式更方便維護和解讀,尤其是需要維護大量數(shù)據(jù)且有中文字符的場景。

先寫一個工具類TestUtils:

  • 定義一個靜態(tài)方法initParam(),該方法會讀取類路徑下的一個properties文件,將文件內容以Properties格式返回,properties文件路徑由輸入?yún)?shù)proptiesFileInClassPath指定。
  • 定義一個靜態(tài)方法loadParam(),該方法需要三個輸入?yún)?shù)。第一個為Properties類型的propParams,另外兩個是String類型,分別是測試類名和測試類中的方法。該方法的作用是用來將propParams中匹配測試類和測試方法的測試數(shù)據(jù)以二維對象數(shù)組的類型返回。
src/test/java/com/fastjrun.example/testng/utils/TestUtils.java
package com.fastjrun.example.testng.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;

public class TestUtils {
public static Properties initParam(String proptiesFileInClassPath) throws IOException {
Properties properties = new Properties();
InputStream inParam = TestUtils.class.getResourceAsStream(proptiesFileInClassPath);
properties.load(inParam);
assert inParam != null;
inParam.close();
return properties;
}

public static Object[][] loadParam(Properties propParams, String className, String methodName) {
assert propParams != null;
Set keys = propParams.stringPropertyNames();
List valueObjects = new ArrayList<>();

for(String key: keys) {
if (key.startsWith(className.concat(".").concat(methodName).concat("."))) {
String value = propParams.getProperty(key);
String[] params = value.split(",");
Object[] valueObject = new Object[params.length];
for(int i=0;i if(params[i].split(":").length>1){
String type = params[i].split(":")[1];
switch (type){
case "Integer":
valueObject[i]=Integer.parseInt(params[i].split(":")[0]);
break;
case "Boolean":
valueObject[i]=Boolean.parseBoolean(params[i].split(":")[0]);
break;
default:
valueObject[i]=params[i].split(":")[0];
break;
}
}else{
valueObject[i]=params[i];
}
}
valueObjects.add(valueObject);
}
}
Object[][] object = new Object[valueObjects.size()][];
for(int i = 0; i < object.length; ++i) {
object[i] = new Object[valueObjects.get(i).length];
System.arraycopy(valueObjects.get(i), 0, object[i], 0, valueObjects.get(i).length);
}

return object;
}
}

再寫一個測試類PrimeNumberCheckerTest2:

  • 該類和PrimeNumberCheckerTest只有方法primeNumbers不同。
  • 在PrimeNumberCheckerTest2的primeNumbers方法定義中,多了類型為Method的輸入?yún)?shù)method,方法體也換成了從classpath下的dev.properties文件獲取測試參數(shù)。
src/test/java/com/fastjrun.example/testng/PrimeNumberCheckerTest2.java
package com.fastjrun.example.testng;

import com.fastjrun.example.testng.utils.TestUtils;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Properties;

public class PrimeNumberCheckerTest2 {
private PrimeNumberChecker primeNumberChecker;

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

@DataProvider(name = "test1")
public Object[][] primeNumbers(Method method) {
Properties properties;
try {
properties = TestUtils.initParam("/dev.properties");
} catch (IOException e) {
throw new RuntimeException(e);
}
return TestUtils.loadParam(properties, this.getClass().getSimpleName(), method.getName());
}

@Test(dataProvider = "test1")
public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) {
System.out.println(inputNumber + " " + expectedResult);
Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber));
}
}

準備測試數(shù)據(jù)文件內容

src/test/resources/dev.properties
PrimeNumberCheckerTest2.testPrimeNumberChecker.1=2:Integer,true:Boolean
PrimeNumberCheckerTest2.testPrimeNumberChecker.2=6:Integer,false:Boolean
PrimeNumberCheckerTest2.testPrimeNumberChecker.3=19:Integer,true:Boolean
PrimeNumberCheckerTest2.testPrimeNumberChecker.4=22:Integer,false:Boolean
PrimeNumberCheckerTest2.testPrimeNumberChecker.5=23:Integer,true:Boolean

在PrimeNumberCheckerTest2類編輯窗口選中需要測試的方法名testPrimeNumberChecker,點擊鼠標右鍵彈出下拉菜單后,從中選擇“Run testPrimeNumberChecker()”即可執(zhí)行該單元測試用例。

執(zhí)行結果如下:

23 true
22 false
19 true
6 false
2 true

===============================================
Default Suite
Total tests run: 5, Passes: 5, Failures: 0, Skips: 0
===============================================

從結果可以看出,該測試用例也可以一次性執(zhí)行5組測試數(shù)據(jù)。如果需要調整測試數(shù)據(jù),只需要直接修改dev.properties就可以了。

測試數(shù)據(jù)和測試環(huán)境分離實踐

寫一個測試類PrimeNumberCheckerTest3,該類在PrimeNumberCheckerTest2的基礎上做了重構,重構要點如下:

  • 新增了類型為Properties的成員變量properties,用來裝載從測試數(shù)據(jù)文件讀入的測試數(shù)據(jù)。
  • 讀取測試數(shù)據(jù)文件的邏輯從primeNumbers方法移入了initialize方法,同時使用了注解BeforeClass,確保該方法在JVM加載PrimeNumberCheckerTest3后第一時間執(zhí)行,并將測試數(shù)據(jù)裝載到成員變量properties。
  • initialize方法使用注解Parameters來初始化測試數(shù)據(jù)文件名,以便后續(xù)執(zhí)行測試用例的時候可以通過-D命令參數(shù)來調整具體的測試數(shù)據(jù)文件。
  • primeNumbers方法修改為從成員變量properties匹配測試類和測試方法的測試數(shù)據(jù)以二維對象數(shù)組的類型返回。
src/test/java/com/fastjrun.example/testng/PrimeNumberCheckerTest3.java
package com.fastjrun.example.testng;

import com.fastjrun.example.testng.utils.TestUtils;
import org.testng.Assert;
import org.testng.annotations.*;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Properties;

public class PrimeNumberCheckerTest3 {
private PrimeNumberChecker primeNumberChecker;

private Properties properties= new Properties();

@BeforeClass
@Parameters({"envName"})
public void initialize( @Optional("dev") String envName) {
primeNumberChecker = new PrimeNumberChecker();
try {
properties = TestUtils.initParam("/" + envName + ".properties");
} catch (IOException e) {
throw new RuntimeException(e);
}
}

@DataProvider(name = "test1")
public Object[][] primeNumbers(Method method) {
return TestUtils.loadParam(properties, this.getClass(). 分享名稱:TestNG參數(shù)化測試實踐指南
本文來源:http://www.5511xx.com/article/cdpjggh.html