TestNG中DataProvider和Factory之间有什么区别?

何时使用DataProvider以及何时使用Factory?

数据提供程序始终创建相同的数据集。 因此,如果您需要Person实例,您将始终从数据提供者处获得名为John Wayne的人员。 它们提供静态数据。 当您为测试提供两个对象时,这对于测试参数化很有用 – 首先是方法输入,第二个是您期望的。

工厂允许您动态创建测试。 。 它们提供动态数据,如随机内容,或者如果您想调用带有diffrend参数的方法。

工厂实现为测试类的每个单独实例执行测试方法。 DataProvider为测试类的单个实例执行测试方法的位置。

TLDR

  • @DataProvider – >用于SINGLE方法的params
  • @Factory – >类中所有方法的参数

让我先来使用DataProviders

 public class VeryImportantTest { @DataProvider public static Object[][] numberProvider() { return new Object[][]{ {1}, {2} }; } // DataProvider provides data to a SINGLE method @Test(dataProvider = "numberProvider") public void test1(int num){ Assert.assertNotEquals(3, num); } @Test(dataProvider = "numberProvider") public void test2(int num){ // ... } @Test(dataProvider = "numberProvider") public void test3(int num){ // ... } // Hmmm... I still have 10 tests to write here, // and it's getting annoying to specify the dataprovider everytime... } 

但不是@Factory

 public class FactoryExample { @Factory public Object[] factoryMethod() { return new Object[] { new FactoryExample(0), new FactoryExample(1) }; } private int number; private FactoryExample(){} private FactoryExample(int number) { this.number = number; } // Now there's no need to specify dataproviders everywhere, nice @Test public void test1(){ Assert.assertNotEquals(3, number); } @Test public void test2(){ // <-- No need to specify params in each method either // ... } } 

使用Factory时请注意两件事:

1)您必须指定一个无参数构造函数或使字段+方法静态 。 在这里查看更多

2)使用@DataProvider ,您的@BeforeClass将被执行一次 。 使用@Factory ,它将在每次迭代时执行。