# TestNG – `@Factory`和`@DataProvider`之间的区别

> 原文： [https://howtodoinjava.com/testng/testng-difference-between-factory-and-dataprovider/](https://howtodoinjava.com/testng/testng-difference-between-factory-and-dataprovider/)

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

## `@Factory`和`@DataProvider`之间的区别

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

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

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

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

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

## `@DataProvider`示例

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

```java
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" } };
	}
}

```

让我们进行测试。

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

```

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

## `@Factory`示例

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

```java
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") 
							};
	}
}

```

让我们进行测试。

```java
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`）。

**祝您学习愉快！**