TestNg的@Factory注解从字面意思上来讲就是采用工厂的方法来创建测试数据并配合完成测试
其主要应对的场景是:对于某一个测试用例或方法,我们需要输入多个测试数据进行测试,并且这些测试数据可以是有一定关系(可以通过代码控制),
ps. 其实就是用一个类封装这些测试数据。在默认情况下,testNG调用测试类的无参数构造方法,将测试类实例化,然后执行在每个测试类中的测试方法,如果测试类没有无参数的构造方法,就会报错。使用@Factory可以实现调用有参数的构造函数来创建实例对象。
此时,我们就可以把自动化或者手动测试时的遇到的只因测试数据不同的多个测试用例合并成一个测试用例,来进行更方便和快捷的测试,
对编写自动化测试代码人员节省了很多时间
策略:一般我们会在标有@Factory注解的方法中对测试类进行调用,这时TestNg会自动调用测试类中带有@Test注解的方法
//@Factory返回的是一个一维数组,用于接收@DataProvider返回的二维数组,主要是为了组织如何传递数据
public class HomePageTest {
private String userId;
private String userName;
public HomePageTest(String userId, String userName) {
this.userId = userId;
this.userName = userName;
}
@Test
public void testHomeLogin(){
System.out.println(userId+" = "+userName+" are loggin home page");
}
}
public class LoginPageTest {
private String userId;
private String userName;
public LoginPageTest(String userId, String userName) {
this.userId = userId;
this.userName = userName;
}
@Test
public void testLogin(){
System.out.println(userId+" = "+userName + " are loggin sub page");
}
}
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
public class FactoryAndDataProvider {
@DataProvider(name="dataProvider")
public Object[][] dataProvider(){
Object[][] objects=new Object[2][2];
objects[0][0]="user1";
objects[0][1]="zhangsan";
objects[1][0]="user2";
objects[1][1]="lisi";
return objects;
}
@Factory(dataProvider = "dataProvider")
public Object[] createTest(String userId,String userName){
Object[] test=new Object[2];
test[0]=new HomePageTest(userId,userName);
test[1]=new LoginPageTest(userId,userName);
return test;
}
}
testNG.xml
<suite name="Demo_Test_Suite" parallel="false">
<test name="Demo_Test">
<classes>
<class name="com.testng.FactoryAndDataProvider" />
</classes>
</test>
</suite>
//输出
user1 = zhangsan are loggin home page
user2 = lisi are loggin home page
user1 = zhangsan are loggin sub page
user2 = lisi are loggin sub page
例子2
public class TestNGFactoryTest {
private Integer number;
private static int num;
public TestNGFactoryTest(int number) {
this.number = number;
}
@Test
public void testCount(){
num++;
System.out.println("num "+num +" is "+this.number);
}
}
import org.testng.annotations.Factory;
public class TestNgFactory {
@Factory
public Object[] factoryMethod(){
Object[] result=new Object[10];
for (Integer i = 0; i <10 ; i++) {
result[i]=new TestNGFactoryTest(i*10);
}
return result;
}
}
输出
num 1 is 20
num 2 is 30
num 3 is 50
num 4 is 80
num 5 is 40
num 6 is 0
num 7 is 90
num 8 is 10
num 9 is 70
num 10 is 60
最后有个问题,从上面两个的结果可以看到,最后结果并不是有序的,解决方法,后续。。。。