TestNG – @Factory@DataProvider之间的区别

在学习 TestNG 时,许多人在阅读@DataProvider@Factory注解时会感到困惑 - 什么时候使用什么? 还有什么更好的呢? 让我们看看它们的两个功能。

@Factory@DataProvider之间的区别

以下是 TestNG 上@Factory@DataProvider功能之间的主要区别

  1. 数据供应器:使用数据供应器的测试方法将根据数据供应器提供的数据执行多次。 该测试方法将使用该测试方法所属的相同测试类实例来执行。
  2. 工厂:工厂将使用相应类的单独实例执行测试类中存在的所有测试方法。

TestNG 工厂用于动态创建测试类的实例。 如果要多次运行测试类,这将很有用。 例如,如果您有一个要登录到站点的测试并且想要多次运行该测试,则它易于使用的 TestNG 工厂在其中创建多个测试类实例并运行测试(可能是测试任何内存泄漏) 问题)。

而数据供应器用于为测试提供参数。 如果为测试提供数据供应器,则每次运行测试时将使用不同的值集。 对于需要每次使用不同用户名和密码集登录到站点的情况,这很有用。

让我们创建一个示例,展示这两者之间的明显区别。

@DataProvider示例

下列类包含testMethodbeforeClass方法。 testMethod接受String参数,该参数的值由DataProvider方法dataMethod提供。 beforeClass方法在执行时将消息打印到控制台上,testMethod也是如此。 testMethod在执行时将传递给它的参数打印到控制台。

public class DataProviderClass 
{
	@BeforeClass
	public void beforeClass() {
		System.out.println("Before class executed");
	}

	@Test(dataProvider = "dataMethod")
	public void testMethod(String param) {
		System.out.println("The parameter value is: " + param);
	}

	@DataProvider
	public Object[][] dataMethod() {
		return new Object[][] { { "one" }, { "two" } };
	}
}

让我们进行测试。

Before class executed
The parameter value is: one
The parameter value is: two
PASSED: testMethod("one")
PASSED: testMethod("two")

从前面的测试结果中可以看到,无论执行了多少次测试方法,类beforeClass仅执行一次。

@Factory示例

下列类包含testMethodbeforeClass方法。 测试类的构造器采用String参数值。 beforeClasstestMethod都将消息打印到控制台上。

public class SimpleTest 
{
	private String param = "";

	public SimpleTest(String param) {
		this.param = param;
	}

	@BeforeClass
	public void beforeClass() {
		System.out.println("Before SimpleTest class executed.");
	}

	@Test
	public void testMethod() {
		System.out.println("testMethod parameter value is: " + param);
	}
}

public class SimpleTestFactory 
{
	@Factory
	public Object[] factoryMethod() {
		return new Object[] { 
								new SimpleTest("one"), 
								new SimpleTest("two") 
							};
	}
}

让我们进行测试。

Before SimpleTest class executed.
testMethod parameter value is: two
Before SimpleTest class executed.
testMethod parameter value is: one
PASSED: testMethod
PASSED: testMethod

从先前的测试结果可以看出,在每次执行testMethod之前,都会执行beforeClass方法。 这表明工厂实现对测试类的每个单独实例执行测试方法。 如前所述,DataProvider为测试类的单个实例执行测试方法(testMethod)。