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
,它将在每次迭代时执行。