Java TestNG中作为@DataProvider的自定义类数组
我想知道是否有办法将Java TestNG中作为@DataProvider的自定义类数组,java,selenium,testng,Java,Selenium,Testng,我想知道是否有办法将@Test方法的所有参数打包成一个类Name,并提供Name[]作为@DataProvider public class FirstTestClass { @Test (dataProvider = "getNames") public void test01(Name name) { System.out.println(name.name + " " + name.id); } @DataProvider public Name[] getN
@Test
方法的所有参数打包成一个类Name
,并提供Name[]
作为@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;
}
}
测试被跳过,我收到一条消息说必须返回Object[]]或Iterator[]
。这是有限的,对吧?对此有解决方法吗?将其更改为
@DataProvider
public Name[][] getNames() {
Name[][] result = new Name[2][];
result[0] = {new Name("john", 5)};
result[1] = {new Name("doe", 4)};
return result;
}
我不知道为什么使用专用类来保存所有属性,但是你应该考虑一些类似的东西:
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 }
}
}
}
在JUnit4.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[][]。我现在理解了您的问题,您需要以下的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;
}
}
公共类FirstTest{
私人最终登录补充登录数据;
@工厂(dataprovider=“generateTestData”)
公共首次测试(LoginCredentials测试数据){
loginData=测试数据;
}
@试验
公共无效测试01(){
系统输出打印LN(登录数据);
}
@数据提供者
公共静态对象[][]generateTestData(){
返回convert(ReadingExcelSheets.generateTestData());
}
公共静态对象[][]转换(LoginCredentials[]值){
对象[][]结果=新对象[values.length];
对于(int i=0;i为什么不能使用只有一列的二维数组来做同样的事情。您有什么具体的要求吗?类似这样的要求
@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;
}
我用我建议的更改测试了您的代码。在我看来,这是非常有限的…JUnit有参数化方法,这些方法接受自定义类数组作为数据提供程序…假设我想测试从DB自动填充表单…返回的表行将有这么多字段…方法签名不能包含所有变量都正确吗?TestNG在这方面非常有限……我不理解你的观点。你能分享一下你的junit方法吗?@RunWith(Parameterized.class)public class FirstTest{private LoginCredentials loginda;public FirstTest(LoginCredentials testData){loginda=testData;}@Parameterized.Parameters公共静态LoginCredentials[]generateTestData(){返回ReadingExcelSheets.generateTestData();}
@Julienin我的观点非常有限……JUnit具有参数化方法,这些方法接受自定义类数组作为数据提供程序……假设我想测试从DB自动填充表单……返回的表行将有这么多字段……方法签名不能包含所有变量,对吗?TestNG在这方面非常有限aspect…@ChandrachudNanduri如果你喜欢JUnit,你应该使用它。但是这里你有相同的自定义类,只包装在数组中,我不认为这有什么大不了的。我刚刚打开了一个项目的相关问题:okie…这是一个解决方法,但不是理想的解决方案…我觉得如果JUnit 4.x支持Object[],那么TestNG也应该如此,它是一个高级且更灵活的框架:)
@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;
}