Testng @返回类型为迭代器的数据提供程序<;对象[]>;
我尝试执行调用DATAsPvices的简单测试用例,这个数据提供者的返回类型为<代码> Iterator < /代码>,我知道这种返回类型不接受<代码> @ DATaValue方法,但是在执行下面的程序之后,我得到了空白输出,在CalBULL中没有显示任何内容。我接受至少像数据提供者不存在这样的消息,请参考下面的程序Testng @返回类型为迭代器的数据提供程序<;对象[]>;,testng,testng-dataprovider,testng-annotation-test,Testng,Testng Dataprovider,Testng Annotation Test,我尝试执行调用DATAsPvices的简单测试用例,这个数据提供者的返回类型为 Iterator < /代码>,我知道这种返回类型不接受 @ DATaValue方法,但是在执行下面的程序之后,我得到了空白输出,在CalBULL中没有显示任何内容。我接受至少像数据提供者不存在这样的消息,请参考下面的程序 public class Practice { @Test(dataProvider="NotWorking") public void t
public class Practice {
@Test(dataProvider="NotWorking")
public void testCase(Object[] obj)
{
System.out.println(obj[0]);
System.out.println(obj[1]);
}
@DataProvider(name="NotWorking")
public Iterator<Object[]> dataProvider2()
{
List<Object[]> obj =new ArrayList<Object[]>();
Object[] obj1=new Object[2];
obj1[0]=new String("First_Object_First_value");
obj1[1]=new String("First_Object_Second_value");
Object[] obj2=new Object[2];
obj2[0]=new String("Second_Object_First_value");
obj1[1]=new String("Second_Object_Second_value");
Iterator<Object[]> itr = obj.iterator();
return itr;
}
}
这是因为
dataProviders
也接受object[]
。您不能将其用于矩阵数据类型,但它受支持
所以如果你有这样的东西:
@DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
{ "Cedric", new Integer(36) },
{ "Anne", new Integer(37)},
};
}
可以很容易地替换为
@DataProvider(name = "test1")
public Object[] createData1() {
return new Object[] {
{ "Cedric"},
{ "Anne"},
};
}
您的obj
is有一个对象的列表
数组
,您将返回obj.iterator()符合数据提供者标准的代码>。您的声明
dataProvider的返回类型为迭代器,我知道@dataProvider method`不接受此返回类型
这实际上是不正确的<代码>迭代器
是testNG中数据提供程序的可接受的返回类型
因此,上述代码的错误在于,您返回的是一个空的迭代器
。
请注意以下代码中的更改:
@DataProvider(name=“NotWorking”)
公共迭代器dataProvider2()
{
List obj=new ArrayList();
对象[]obj1=新对象[2];
obj1[0]=新字符串(“第一个对象第一个值”);
obj1[1]=新字符串(“第一个对象第二个值”);
Object[]obj2=新对象[2];
obj2[0]=新字符串(“第二个对象第一个值”);
obj2[1]=新字符串(“第二个对象第二个值”);//键入错误。使用obj1代替obj2
//您没有添加以下两行
obj.add(obj1);
添加对象(obj2);
迭代器itr=obj.Iterator();
返回itr;
}
现在,在进行上述更改之后,您的测试将正常工作
注意:如果测试方法的数据为空,则不会调用该方法。
那么下一个问题-为什么测试被标记为ran,但没有打印任何内容。
答:这取决于testNG如何处理空迭代器。
版本
7.3.0
和7.4.0
本身之间存在差异。对于7.3.0
它将输出为测试运行:0
,对于7.4.0
它将输出为测试运行:1
。作为7.4.0
的一部分,日志记录中出现了代码更改。7.4.0
的测试方法计数取自测试上下文context.getAllTestMethods()
,其中包含正在运行的测试。对于7.3.0
来说,它是从一个数组m_allTestMethods
(它是空的)。好的,谢谢你的回复,但是在testNg应该如何在控制台中给出一些消息,甚至不是执行测试用例,但它仍然说测试运行:1,为什么?@Ankuspawar:这是因为你返回了obj.iterator()代码>并且没有任何内容。您正在obj1
和obj2
中存储值,但未返回。好的,谢谢,请添加System.out.println(“测试用例”);这一行在测试方法和试着得到的输出你们得到的是相同的输出,但这里至少这一行得到了打印,但没有发生为什么?请帮忙this@ankushpawar:您为什么违反数据提供商原则?看看官员们对如何使用dataProviders@cruisepandey说了些什么,违反了哪个数据提供程序原则?DataProvider允许迭代器
Iterator是DataProvider可接受的返回类型-最终它是一个对象数组,而不是其他类型。为什么要让事情变得复杂?@cruisepandey在这个特定的问题中,返回类型是迭代器还是对象[][]
,并不重要。但是,当您不希望同时加载所有数据,或者希望测试方法接收特定对象而不是一组长参数时,迭代器非常有用<代码>迭代器
或迭代器
可用于此。@cruisepandey对于简单的用例,只需返回对象[]【】
。但需要注意的是,即使我们返回Object[][]
testNG,它也会将其转换为Iterator
。很好,您在github中打开了一个问题。发布链接以供任何人了解更新:
@DataProvider(name = "test1")
public Object[] createData1() {
return new Object[] {
{ "Cedric"},
{ "Anne"},
};
}