ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 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`)。 **祝您学习愉快!**