[英]Is there a way to pass parameters to TestNG test without using @DataProvider & parameters in XML?
[英]how to pass > 10 parameters using TestNG DataProvider?
我需要向 TestNG Dataprovider 传递 10 多个参数,代码看起来像这样......
@Test (dataProvider = "Dataprovider1")
public void testScenario1(String data1, String data2,
String data3, String data4,
String data5 //...
) throws Exception {
System.out.println(data1+"---------------- "+data2+" --------------- "+data3+" .. so on");
}
谁能告诉我,如果我们需要使用@DataProvider
传递 10 个以上的参数,我们应该遵循什么方法? 有没有其他方法可以声明测试方法的参数?
如果您有相同类型的参数,那么您可以在方法参数中作为数组传递。
@Test (dataProvider = "Dataprovider1")
public void testScenario1(String args [])
) throws Exception {
System.out.println(args[0]+"---------------- "+args[1]+" --------------- "+args[3]+" .. so on");
}
此外,如果您有不同类型的参数字段,那么您可以在帮助类的帮助下将其喙化,然后在参数中传递此类的引用。 例如:
class Helper {
String data1;
String data2;
String data3;
Long data4;
int data5;
flot data6;
-----so on------
----getter setter and constructor----
}
你的测试课
class Test {
@DataProvider(name="Dataprovider1")
public static Object[][] testData() {
return new Object[][] {
{ new Helper("hey", "you", "guys" ..... another constructor parameters..) } }
};
}
@Test (dataProvider = "Dataprovider1")
public void testScenario1(Helper helper) throws Exception {
System.out.println(helper.data1+"---------------- "+helper.data2+" --------------- "+helper.data3+" .. so on");
}
}
您可以将 dataprovider 设置为一个 Object 数组,并使用 ArrayList> 将您的参数设置为键值对。
@DataProvider
public Object[][] getTestData()
{
List<HashMap<String, String>> arrayMapList = new ArrayList<HashMap<String, String>>();
HashMap<String, String> hashMapItems = new HashMap<String, String>();
//use a loop to fill in all the parameter name and value pairs
hashMapItems.put("parameterName1", "parameterValue");
hashMapItems.put("parameterName2", "parameterValue");
//--------------More put statements here------
//finally add hash map to the list
arrayMapList.add(hashMapItems);
//Iterate the array list and store each HashMap object in an object array. First dimension is the iterator value.
Object [][] hashMapObj = new Object [arrayMapList.size()][1];
for(int i=0; i<arrayMapList.size() ; i++) {
hashMapObj[i][0] = arrayMapList(i);
}
return hashMapObj;
}
对于数组列表中的每个 hashmap 值,测试方法将使用自己的一组参数运行
@Test (dataProvider = "getTestData", enabled = true)
public void testDataRead(HashMap<String,String> hashMapValue)
{
System.out.println(hashMapValue.get(parameterNameKey)); //parameter 1
System.out.println(hashMapValue.get(parameterNameKey)); //parameter 2
}
当你这样做时,DataProvider 会以一种令人讨厌的语法结束。 下面是一个例子:
@DataProvider(name="objectTestData")
public static Object[][] objectTestData() {
return new Object[][] {
{ new TestData("hey", "you", "guys") },
{ new TestData("Sloth", "Baby", "Ruth") },
{ new TestData("foo", "bar", "baz") }
};
}
@Test(dataProvider="objectTestData")
public void testScenario1(TestData data) {
System.out.println(data.get(0) + "..." + data.get(1) + "..." + data.get(2));
}
static class TestData {
public String[] items;
public TestData(String... items) {
this.items = items; // should probably make a defensive copy
}
public String get(int x) {
return items[x];
}
}
或者,您可以更改 TestData 构造函数以将内容放入单独的命名方法中。 (例如,如果您正在测试地址数据,则可能有 getName、getAddress、getCity。)
在@DataProvider
使用Map
插入多个带值的参数,并返回包含该映射的对象,如下所示:
@DataProvider
public static Object[][]Dataprovider1(){
Map<String, String> map = new HashMap<String, String>();
map.put("data1", "value1");
map.put("data2", "value2");
....
map.put("data10", "value10");
return new Object[][] {
{map}
};
}
在@test
您还可以通过添加Map
作为子参数来获取数据:
@Test(dataProvider = "Dataprovider1")
public void testScenario1(Map<String, String> data) {
System.out.println(data.get("data1"));
System.out.println(data.get("data2"));
....
}
它将产生:
value1
value2
....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.