问题描述
我尝试执行调用 dataProvider 的简单测试用例,并且此 dataProvider 的返回类型为 Iterator<Object[]>
,我知道 @DataProvider
方法不接受此返回类型,但在执行以下程序后我得到colsole 中没有显示空白输出,我至少接受类似 dataProvider 不存在的消息,请参阅下面的程序。
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;
}
}
[RemoteTestNG] detected TestNG version 7.4.0
===============================================
Default test
Tests run: 1,Failures: 0,Skips: 0
解决方法
你的陈述
dataProvider 的返回类型为 Iterator
这实际上不正确。 Iterator<Object[]>
是 testNG 中 dataProvider 的 ACCEPTED 返回类型。
以上代码的错误在于,您返回的是空 Iterator
。
请注意以下代码中的更改:
@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");
obj2[1]=new String("Second_Object_Second_value"); // typo. used obj1 instead of obj2
// You missed to add the below two lines
obj.add(obj1);
obj.add(obj2);
Iterator<Object[]> itr = obj.iterator();
return itr;
}
现在,在进行上述更改后,您的测试将正常工作。
注意:如果该方法的数据为空,则不会调用该方法。
那么下一个问题 - 为什么测试被标记为已运行但没有打印任何内容。
答案:这取决于 testNG 如何处理空迭代器。
版本 7.3.0
和 7.4.0
本身之间存在差异。它将输出为 Test run : 0
的 7.3.0
和 Test run : 1
的 7.4.0
。作为 7.4.0
的一部分,日志记录中的代码发生了变化。 7.4.0
的测试方法计数取自测试上下文 context.getAllTestMethods()
,其中包含您正在运行的测试。对于 7.3.0
,它取自数组 m_allTestMethods
(空)。
那是因为 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
有一个 Object
arrays
列表,您返回的 obj.iterator();
满足 dataProviders 条件。