2016-09-05 67 views
0

我想知道是否有辦法將所有參數打包爲@Test方法爲一個類Name並提供Name[]作爲@DataProviderTestNG中的@DataProvider自定義類數組

public class FirstTestClass { 

    @Test (dataProvider = "getNames") 
    public void test01(Name name) { 
    System.out.println(name.name + " " + name.id); 
    } 
    @DataProvider 
    public Name[] getNames() { 
     Name[] result = new Name[2]; 
     result[0] = new Name("john", 5); 
     result[1] = new Name("doe", 4); 
     return result; 
    } 
} 

class Name { 
    public String name; 
    public Integer id; 
    public Name(String name, Integer id) { 
     this.name = name; 
     this.id = id; 
    } 
} 

該測試正在跳過,我收到一條消息說must return either Object[][] or Iterator<>[]。這是有限的權利?任何解決方法?

回答

0

將其更改爲

@DataProvider 
public Name[][] getNames() { 
    Name[][] result = new Name[2][]; 
    result[0] = {new Name("john", 5)}; 
    result[1] = {new Name("doe", 4)}; 
    return result; 
} 
+0

在我看來,這是非常有限的...... JUnit有參數化方法接受自定義類數組作爲數據提供者...可以說我想測試從DB自動填充表單...表返回的行將有這樣很多領域......方法簽名不能包含所有的變量嗎? TestNG在這方面非常有限...... –

+0

@ChandrachudNanduri如果你喜歡'JUnit',你應該使用它。但是,在這裏你有相同的自定義類只包裹在數組中,我不認爲這是什麼大不了的事。 – talex

0

我不知道爲什麼你使用一個專用的類來保存所有屬性,但你應該考慮是這樣的:

public class FirstTestClass { 

    @Test(dataProvider = "getNames") 
    public void test01(String name, Integer id) { 
    System.out.println(name + " " + id); 
    } 

    @DataProvider 
    public Object[][] getNames() { 
    return new Object[][] { 
     new Object[] { "john", 5 }, 
     new Object[] { "doe", 4 } 
    } 
    } 
} 
+0

在我看來,這是非常有限的... JUnit有接受自定義類數組作爲數據提供者的參數化方法...可以說我想測試從DB自動填充表單...返回的行將有很多字段...方法簽名不能包含所有的變量嗎? TestNG在這方面非常有限...... –

+0

我不理解你的觀點。你能分享你的junit方式嗎? – juherr

+0

'@RunWith(參數化。類) public class FirstTest { \t private LoginCredentials loginData; \t \t public FirstTest(LoginCredentials testData){ \t \t loginData = testData; \t} \t @ Parameterized.Parameters \t公共靜態LoginCredentials [] generateTestData(){ \t \t返回ReadingExcelSheets.generateTestData(); \t}' @Julien –

0

在JUnit 4.x中,以下是實現上述場景的方法。

@RunWith(Parameterized.class) 
public class FirstTest { 
    private LoginCredentials loginData; 

    public FirstTest(LoginCredentials testData) { 
     loginData = testData; 
    } 

@Parameterized.Parameters 
public static LoginCredentials[] generateTestData() { 
    return ReadingExcelSheets.generateTestData(); 
} 

我希望在TestNG中有類似的東西,我被告知比JUnit更加靈活和強大。原來,我們只在@DataProvider方法中返回Object [] []。

0

正如我現在明白你的問題,你想的TestNG的翻譯:

@RunWith(Parameterized.class) 
public class FirstTest { 
    private LoginCredentials loginData; 

    public FirstTest(LoginCredentials testData) { 
     loginData = testData; 
    } 

    @Parameterized.Parameters 
    public static LoginCredentials[] generateTestData() { 
     return ReadingExcelSheets.generateTestData(); 
    } 
} 

一個解決辦法是:

public class FirstTest { 

    private final LoginCredentials loginData; 

    @Factory(dataprovider = "generateTestData") 
    public FirstTest(LoginCredentials testData) { 
     loginData = testData; 
    } 

    @Test 
    public void test01() { 
     System.out.println(loginData); 
    } 

    @DataProvider 
    public static Object[][] generateTestData() { 
     return convert(ReadingExcelSheets.generateTestData()); 
    } 

    public static Object[][] convert(LoginCredentials[] values) { 
     Object[][] result = new Object[values.length]; 
     for (int i=0; i<result.length; i++) { 
      result[i] = new Object[]{ values[i] }; 
     } 
     return result; 
    } 
} 

或者

public class FirstTest { 

    @Test(dataprovider = "generateTestData") 
    public void test01(LoginCredentials loginData) { 
     System.out.println(loginData); 
    } 

    @DataProvider 
    public static Object[][] generateTestData() { 
     return convert(ReadingExcelSheets.generateTestData()); 
    } 

    public static Object[][] convert(LoginCredentials[] values) { 
     Object[][] result = new Object[values.length]; 
     for (int i=0; i<result.length; i++) { 
      result[i] = new Object[]{ values[i] }; 
     } 
     return result; 
    } 
} 

而行, TestNG可以提供convert方法本身和/或管理Object[]作爲有效的re即開即用型。

隨意提出對http://github.com/cbeust/testng 幫助補丁總是歡迎:)

+0

我剛剛開了一個相關的問題的項目:https://github.com/cbeust/testng/issues/1139 – juherr

0

你爲什麼不能做使用二維數組一樣的東西,只有1列。你有什麼具體要求嗎?像這樣的東西

@Test(dataProvider = "getNames") 
public void test01(Name name) { 
    System.out.println(name.name + " " + name.id); 
} 

@DataProvider 
public Object[][] getNames() { 
    Name[][] result = new Name[2][1]; 
    result[0][0] = new Name("john", 5); 
    result[1][0] = new Name("doe", 4); 
    return result; 
} 

我測試了你的代碼和更改我建議它工作得很好。

+0

okie ......這是一種解決方法,但它不是理想解決方案...我覺得如果JUnit 4.x支持Object [],那麼TestNG應該是先進的和更靈活的框架:) –