解释TestNG Object [] []数据提供者VS之间的差异。 Iterable <object []>数据提供程序?</object []>

时间:2014-10-08 18:31:44

标签: testng

有人可以解释Object [] [] DataProvider与Iterable DataProvider之间的区别吗?

TestNG文档说明如下,但对我来说还不够清楚。我一直使用Object [] []方法,因为Iterator方法的解释有点神秘,很难理解他在段落中的真正含义。

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. 

我在这里问了这个问题,但不确定我是否会在那里得到答案: https://groups.google.com/forum/#!topic/testng-users/NgZrMfprriY

2 个答案:

答案 0 :(得分:0)

我有一个简单的规则:

尽可能使用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
}

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

答案 1 :(得分:0)

如果您的数据设置步骤非常耗时,则基本上会使用迭代器。

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

  1. 使用Object [] [],您的第一个测试将在生成所有数据后400秒后运行
  2. 使用迭代器,如果将处理逻辑移至next()方法,则第一次测试在2秒后开始,测试执行,然后进行下一次数据设置。
  3. 因此,如果您的数据集很长,那么选择主要取决于您希望如何构建测试。