2013-04-30 35 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"); 
} 
}