如何使用TestNG的DataProvider传递超过10个参数?

4
我需要将超过10个参数传递给TestNG Dataprovider,代码看起来有点像这样...
@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个参数时该遵循什么方法?是否有其他方式声明测试方法的参数?


如果你的方法需要传入10个参数,你就必须在声明时指定这10个参数。 - Cedric Beust
@CedricBeust 如果我们在测试方法中声明超过10个参数,那么代码看起来有些奇怪,我想知道是否有办法在测试方法的参数列表部分动态地声明这些参数数量。 - Naveen Kanak
将它们传递到一个对象中即可。无论如何,这是一个Java问题,而不是TestNG的问题。 - Cedric Beust
4个回答

6
如果您有相同类型的参数,则可以将其作为数组传递给方法参数。
@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");
}
}

2
您可以将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;
}

对于数组列表中的每个哈希映射值,测试方法将使用其自己的参数集运行

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

@mkl,searchStrings.get(i)是什么? - Benjamin McFerren
@BenjaminMcFerren *"searchStrings.get(i)"*是什么?- 我不知道。答案来自NethajiPrabhu,我仅仅改善了一下格式。 - mkl
考虑到整个答案...我假设这段代码已经从更大的代码中复制并粘贴在一起了,可能searchStrings应该改为arrayMapList,至少这样可以匹配实际测试方法的签名。 - mkl
@BenjaminMcFerren mkl 是正确的,我犯了错,应该是 arrayMapList。 - NethajiPrabhu
该行代码 hashMapObj[i][0] = arrayMapList(i); 应改为 hashMapObj[i][0] = arrayMapList.get(i); - Ayush Choudhary

0

当你这样做时,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。)


0
在编程中,可以使用@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
....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接