2013-04-30 163 views
2

我需要超过10个参数传递给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个参数?是否有其他方式来声明测试方法的参数?

+0

如果你的方法需要10个参数,需要用10个参数来声明它。 – 2013-04-30 16:35:41

+0

@CedricBeust如果我们在测试方法中声明了超过10个参数,那么代码看起来有些奇怪,我想知道是否有任何方法可以在测试方法的参数列表部分动态声明这些参数数量。 – 2013-05-02 04:31:30

+0

然后将它们传递给对象。无论哪种方式,这是一个Java问题,而不是TestNG。 – 2013-05-02 18:19:01

回答

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

您可以将数据提供者设置为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] = searchStrings.get(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 
} 
0

如果有相同类型的参数,那么您可以通过如在阵列方法参数。

@Test (dataProvider = "Dataprovider1") 
public void testScenario1(String args []) 
      ) throws Exception { 
    System.out.println(args[0]+"---------------- "+args[1]+" --------------- "+args[3]+" .. so on"); 
} 

此外,如果你有不同的类型参数字段,那么你可以用一个辅助类的帮助下喙,然后通过这个类的参数参考。 e.g:

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