何时使用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[]。返回的对象可以是任何类(不一定是与工厂类相同的类)。
而DataProvider用于为测试提供参数。如果您将DataProvider提供给测试,那么每次运行测试都会采用不同的值集合。这对于诸如您想要使用不同的用户名和密码登录网站的情况非常有用。
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;
}
}
Factory(工厂)实现会为测试类的每一个实例执行测试方法,而 DataProvider(数据提供者)则为测试类的单个实例执行测试方法。
简而言之:
@DataProvider
-> 适用于单个方法的参数@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
将在每次迭代中执行。