TestNG数据提供者

时间:2020-02-23 14:41:55  来源:igfitidea点击:

DataProvider是TestNG框架的最佳功能之一。
我们可以使用TestNG DataProvider将参数注入到我们的测试方法中。

TestNG数据提供者

TestNG DataProvider帮助我们创建松耦合的测试用例。
我们可以将测试逻辑和输入数据分成不同的方法,这样我们也可以将来自DataProvider的输入数据重用于多种测试方法。

让我们看看如何使用Eclipse插件为TestNG类创建一个简单的DataProvider。
在Eclipse中,转到新建|其他| TestNG Class,然后在向导屏幕中,选择" @DataProvider"注释。

当您单击"完成"按钮时,我们将使用DataProvider方法获得TestNG测试类的默认实现。

package com.theitroad.dataprovider;

import org.testng.annotations.Test;
import org.testng.annotations.DataProvider;

public class Test4 {
@Test(dataProvider = "dp")
public void f(Integer n, String s) {
	  
}

@DataProvider
public Object[][] dp() {
  return new Object[][] {
    new Object[] { 1, "a" },
    new Object[] { 2, "b" },
  };
}
}

请注意,不必使用Eclipse TestNG插件,但它可以帮助我们轻松创建基类,然后根据我们的项目用例对其进行更改。

注意,dp()方法以@DataProvider注释为注释,我们在@Test配置中使用了它。

DataProvider方法必须返回Object数组,并且其维必须与测试方法匹配。
由于我们的测试方法有两个参数,因此我们的DataProvider方法必须返回Object [] [],以便将其映射到方法参数。

只需运行上述类作为TestNG测试,我们将在控制台中获得以下输出。

[RemoteTestNG] detected TestNG version 6.14.3
PASSED: f(1, "a")
PASSED: f(2, "b")

TestNG @DataProvider属性

@DataProvider批注具有三个属性:

  • name:用于指定数据提供者方法的名称,默认值为函数名称。
    我们可以使用它为我们的数据提供者方法命名。

  • indices:这是一个非常重要的属性,它使我们可以指定要用于测试目的的索引。
    当我们的数据提供者方法可能包含大量值并且我们只希望对其中一些进行测试时,这很有用。
    它的默认值为" all",因此将对由数据提供者方法生成的所有输入运行测试。

  • parallel:此参数告诉TestNG并行运行测试。
    因此,可以随机顺序注入测试方法的输入。
    默认情况下,将按顺序注入输入,并按顺序执行测试。

让我们看一个示例,其中我更改了DataProvider方法的名称,并且仅使用了该方法生成的一些输入。

package com.theitroad.dataprovider;

import org.testng.annotations.Test;
import org.testng.annotations.DataProvider;

public class Test4 {
@Test(dataProvider = "fooDP")
public void foo(Integer n) {
	  System.out.println("Inside foo, input = "+n);
}

@DataProvider(name="fooDP", indices= {1,3,5,7,9})
public Object[] dp() {
	  Object[] ints = new Object[100];
	  for(int i =0 ; i<100; i++) {
		  ints[i] = 100+i;
	  }
  return ints;
}
}

现在,当我们运行测试类时,它将生成以下输出。

[RemoteTestNG] detected TestNG version 6.14.3
Inside foo, input = 101
Inside foo, input = 103
Inside foo, input = 105
Inside foo, input = 107
Inside foo, input = 109
PASSED: foo(101)
PASSED: foo(103)
PASSED: foo(105)
PASSED: foo(107)
PASSED: foo(109)

现在,更改DataProvider方法以并行运行。

@DataProvider(parallel=true, name="fooDP", indices= {1,3,5,7,9})
public Object[] dp() {
//method logic
}

执行测试类时生成的输出:

[RemoteTestNG] detected TestNG version 6.14.3
Inside foo, input = 105
Inside foo, input = 107
Inside foo, input = 109
Inside foo, input = 103
Inside foo, input = 101
PASSED: foo(103)
PASSED: foo(105)
PASSED: foo(107)
PASSED: foo(109)
PASSED: foo(101)

请注意,如果DataProvider返回的对象数量少于指定的数量,'indices'值不会引起任何异常。
因此,下面的DataProvider实现也可以正常工作。

@DataProvider(parallel = true, name = "fooDP", indices = { 1, 3, 5, 7, 9 })
public static Object[] dp() {
	Object[] ints = new Object[3];
	ints[0] = 0;ints[1] = 1;ints[2] = 2;
	return ints;
}

TestNG DataProvider类

TestNG被设计为松散耦合的,因此也难怪我们可以选择将测试类与数据提供者类分开。
我们可以使用@Test属性dataProviderClass来提供要查找DataProvider方法的类的名称。

如果指定了此属性,则数据提供者方法在指定的类中必须是静态的。
如果未指定,则将在测试类或者其超类中查找数据提供者。

这是一个单独的TestNG DataProvider类的示例。

package com.theitroad.dataprovider;

import org.testng.annotations.DataProvider;

public class Test4DataProvider {

	@DataProvider(parallel = true, name = "fooDP", indices = { 1, 3, 5, 7, 9 })
	public static Object[] dp() {
		Object[] ints = new Object[100];
		for (int i = 0; i < 100; i++) {
			ints[i] = 100 + i;
		}
		return ints;
	}
}

我们更新的测试类:

package com.theitroad.dataprovider;

import org.testng.annotations.Test;

public class Test4 {
	@Test(dataProvider = "fooDP", dataProviderClass = Test4DataProvider.class)
	public void foo(Integer n) {
		System.out.println("Inside foo, input = " + n);
	}
}

带工厂的TestNG DataProvider

我们也可以将DataProvider和Factory方法一起使用。
下面的代码片段显示了一个使用带有Factory批注的DataProvider的简单示例。

@Factory(dataProvider = "dp")
public Object[] getTestClasses(String s) {
	Object[] tests = new Object[2];
	tests[0] = new Test1(s);
	tests[1] = new Test2();
	return tests;
}

@DataProvider
public Object[] dp() {
	return new Object[] {"A", "B"};
}