как да предам › 10 параметъра с помощта на TestNG DataProvider?

Трябва да предам повече от 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");
}

Може ли някой да ми каже какъв подход трябва да следваме, в случай че трябва да предадем повече от 10 параметъра с помощта на @DataProvider? Има ли друг начин за деклариране на параметрите за тестовия метод?


person Naveen Kanak    schedule 30.04.2013    source източник
comment
Ако вашият метод приема 10 параметъра, трябва да го декларирате с 10 параметъра.   -  person Cedric Beust    schedule 30.04.2013
comment
@CedricBeust, ако декларираме повече от 10 параметъра в тестовия метод, тогава кодът изглеждаше малко странно, исках да знам има ли някакъв начин да декларирам този брой параметри динамично в секцията със списък с параметри на тестовия метод.   -  person Naveen Kanak    schedule 02.05.2013
comment
След това ги прекарайте вътре в обект. Така или иначе, това е въпрос за Java, а не за TestNG.   -  person Cedric Beust    schedule 02.05.2013


Отговори (4)


Ако имате същия тип параметри, тогава можете да предадете като масив в параметъра на метода.

@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");
}
}
person Bhushan Uniyal    schedule 09.05.2017

Можете да настроите доставчика на данни да бъде масив от 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
}
person NethajiPrabhu    schedule 09.05.2017
comment
@mkl какво е searchStrings.get(i)? - person Benjamin McFerren; 18.05.2018
comment
@BenjaminMcFerren какво е searchStrings.get(i) - нямам представа. Отговорът е от NethajiPrabhu, просто подобрих малко форматирането. - person mkl; 18.05.2018
comment
@BenjaminMcFerren Имайки предвид целия отговор обаче... Предполагам, че кодът е копиран и поставен заедно от нещо по-голямо, вероятно searchStrings трябваше да бъде arrayMapList, поне това ще съответства на подписа на действителния тестов метод. - person mkl; 18.05.2018
comment
@BenjaminMcFerren mkl е правилен, лошата ми грешка трябваше да е arrayMapList. - person NethajiPrabhu; 09.09.2019

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.)

person Barett    schedule 22.06.2015

Използвайте Map в @DataProvider, за да вмъкнете много параметри със стойността и връща обекта, който съдържа картата, както по-долу:

@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
....
person frianH    schedule 17.04.2020