TestNG中的DataProvider和Factory有什么区别?
何时使用 DataProvider,何时使用 Factory ?
TestNG 工厂用于动态创建测试类的实例。如果要不运行测试类,这将非常有用。例如,如果您有一个要登录到站点的测试,并且想要多次运行此测试,那么它易于使用TestNG工厂,您可以在其中创建测试类的多个实例并运行测试。
public class WebTestFactory {
//createInstances method will create 10 objects of WebTest class
@Factory
public Object[] createInstances() {
Object[] result = new Object[10];
for (int i = 0; i < 10; i++) {
result[i] = new WebTest(i);
}
return result;
}
测试类现在是:
public class WebTest {
private int m_numberOfTimes;
public WebTest(int numberOfTimes) {
m_numberOfTimes = numberOfTimes;
}
@Test
public void testServer() {
//Code to test the application
}
}
您的 testng.xml只需要引用包含工厂方法的类,因为测试实例本身将在运行时创建:
<class name="WebTestFactory" />
工厂方法可以像@Test一样接收参数,@Before/After,并且必须返回 Object[]。返回的对象可以是任何类(不一定与工厂类相同)。
然而,数据提供器用于为测试提供参数。如果为测试提供提供器,则每次都将使用不同的值集运行测试。这对于您希望每次使用不同的用户名和密码集登录站点等方案非常有用。
public class DataProviderTest {
@Test(dataProvider= "data")
public void TestUltimatixFromExcelData(String userName,String password) {
WebDriver driver;
driver=new FirefoxDriver();
//Test to login into a site
}
@DataProvider(name="data")
public static Object[][] dataProviderTest() throws Exception{
Object[][] returnArray={new Object[]{"username1","password1"},new Object[]{"username2","password2"},new Object[]{"username3","password3"}
};
return returnArray;
}
}
数据访问接口始终创建相同的数据集。因此,如果您需要Person实例,您将始终从数据提供商那里获得名为John Wayne的人。它们提供静态数据。当您为测试提供两个对象时,这对于测试参数化非常有用 - 第一个是方法输入,其次是您期望的对象。
工厂允许您动态创建测试。它们提供动态数据,如随机内容,或者如果您想使用差异参数调用某些方法。