解释TestNG对象[][]数据提供程序与Iterable之间的差异<;对象[]>;数据提供者?

解释TestNG对象[][]数据提供程序与Iterable之间的差异<;对象[]>;数据提供者?,testng,Testng,有人能解释一下对象[][]数据提供程序与Iterable数据提供程序之间的区别吗 TestNG文档如下所示,但对我来说还不够清楚。我一直使用Object[][]方法,因为迭代器方法的解释有点含糊不清,很难理解他在这一段中的真正意思 The Data Provider method can return one of the following two types: - An array of array of objects (Object[][]) where the first dim

有人能解释一下对象[][]数据提供程序与Iterable数据提供程序之间的区别吗

TestNG文档如下所示,但对我来说还不够清楚。我一直使用Object[][]方法,因为迭代器方法的解释有点含糊不清,很难理解他在这一段中的真正意思

The Data Provider method can return one of the following two types:

  - An array of array of objects (Object[][]) where the first dimension's size is 
    the number of times the test method will be invoked and the second dimension
    size contains an array of objects that must be compatible with the parameter 
    types of the test method. This is the cast illustrated by the example above.

  - An Iterator<Object[]>. The only difference with Object[][] is that an Iterator
    lets you create your test data lazily. TestNG will invoke the iterator and then
    the test method with the parameters returned by this iterator one by one. This is
    particularly useful if you have a lot of parameter sets to pass to the method and 
    you don't want to create all of them upfront. 
数据提供程序方法可以返回以下两种类型之一:
-对象数组的数组(对象[][]),其中第一个维度的大小为
调用测试方法的次数以及第二个维度
size包含必须与参数兼容的对象数组
试验方法的类型。这是上面的例子说明的演员阵容。
-迭代器。对象[][]的唯一区别是迭代器
允许您惰性地创建测试数据。TestNG将调用迭代器,然后
带有此迭代器逐个返回的参数的测试方法。这是
如果有很多参数集要传递给方法和
您不想预先创建所有这些。
我在这里问了这个问题,但不确定是否会在那里得到答案: 我有一个简单的规则:

尽可能地使用Object[][],因为测试用例的格式可以很好且可读:

private static final String LOWERCASE_Y = "y";
private static final String UPPERCASE_Y = "Y";
private static final String STUDENT = "Student";

@DataProvider
public final Object[][] testCases() {
    //@formatter:off
    return new Object [][]{
        { null, UPPERCASE_Y },
        { null, LOWERCASE_Y },
        { StringUtils.EMPTY, LOWERCASE_Y },
        { StringUtils.EMPTY, UPPERCASE_Y },
        { STUDENT, UPPERCASE_Y },
        { STUDENT, LOWERCASE_Y },
    };
    //@formatter:on
}

这有时并不合适(例如,您有动态测试用例或需要生成它们)。在这种情况下,您可以向一些集合提供测试用例并返回迭代器。但我很少使用它。

如果数据设置步骤很耗时,基本上会使用迭代器

假设您正在从excel中读取数据,并根据excel进行一些处理以生成数据—可能调用Web服务或其他io操作。如果处理每个数据需要2秒,并且考虑到您有200个数据

  • 对于对象[],您的第一个测试将在生成所有数据400秒后运行
  • 使用迭代器,如果将处理逻辑移动到next()方法,则第一个测试在2秒后开始,测试执行,然后进行下一个数据设置

  • 因此,如果您的数据设置很长,那么选择基本上取决于您希望测试的结构。

    那么,听起来TestNG会自动为我处理对next()的调用吗?那么,当参数从数据源输入时,数据提供者将阻止并分发参数?所以,测试实例将在可用时启动,对吗?是的,TestNG在每个测试完成后处理对next的调用。现在对我来说,这一切都非常有意义。我讨厌看不到一些TestNG源代码,所以我可以看到这些东西是如何工作的。我浏览了GitHub TestNG repo中的源代码,它似乎缺少一些东西?我不确定。