目录
(一)TestNG学习之路—HelloWorld入门
(二)TestNG学习之路—注解及属性概览
(三)TestNG学习之路—TestNG.xml/YAML
(四)TestNG学习之路—注解详述之@Test
(五)TestNG学习之路—注解详述之参数化
(六)TestNG学习之路—注解详述之@Factory
(七)TestNG学习之路—注解详述之忽略测试
(八)TestNG学习之路—注解详述之并发
(九)TestNG学习之路—失败测试重跑
(十)TestNG学习之路—编码执行TestNG
(十一)TestNG学习之路—BeanShell高级用法
(十二)TestNG学习之路—注解转换器
(十三)TestNG学习之路—方法拦截器
(十四)TestNG学习之路—TestNG监听器
(十五)TestNG学习之路—依赖注入
(十六)TestNG学习之路—测试报告
(十七)基于TestNG+Rest Assured+Allure的接口自动化测试框架
前言
使用@Factory可动态地创建测试,一般用来创建一个测试类的多个实例,每个实例中的所有测试用例都会被执行,@Factory构造实例的方法必须返回Object[]。
@Factory详解
创建测试类如下,其中test1依赖于test方法。
import org.testng.annotations.Test;
public class TomandyFactory {
private String str;
public TomandyFactory(String str){
this.str = str;
}
@Test
public void test(){
System.out.println("TomandyFactory: " +str);
}
@Test(dependsOnMethods = "test")
public void test1(){
System.out.println("TomandyFactory1: " +str);
}
}
创建工厂测试类,该工程创建2个TomandyFactory实例。
import org.testng.annotations.Factory;
public class TestFactory {
@Factory
public Object[] test(){
Object[] object = new Object[2];
for(int i=0;i<2;i++) {
TomandyFactory tomandyFactory = new TomandyFactory(i+"");
object[i] = tomandyFactory;
}
return object;
}
}
testng.xml配置工厂类名TestFactory即可:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
<test verbose="2" preserve-order="true" name="Test">
<classes>
<class name="TestFactory">
</class>
</classes>
</test>
</suite>
执行结果:
TomandyFactory: 0
TomandyFactory: 1
TomandyFactory1: 0
TomandyFactory1: 1
===============================================
All Test Suite
Total tests run: 4, Failures: 0, Skips: 0
===============================================
通过以上例子的执行结果可以发现,尽管test1方法依赖于test方法,但@Factory工厂测试类的执行测试类方法的顺序却是:test,test,test1,test1,如果需要执行类似登录、退出之类的功能,并不能满足咱们的需求,此类场景,官网也给出了解决方案,那就是在testng.xml添加:
<suite name="Factory" group-by-instances="true">
or
<test name="Factory" group-by-instances="true">
还是上面的例子,修改testng.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite" group-by-instances="true">
<test verbose="2" preserve-order="true" name="Test">
<parameter name="para" value="Tomandy"/>
<classes>
<class name="TestFactory">
</class>
</classes>
</test>
</suite>
执行结果如下,测试类方法执行顺序为:test,test1,test,test1。
TomandyFactory: 0
TomandyFactory1: 0
TomandyFactory: 1
TomandyFactory1: 1
===============================================
All Test Suite
Total tests run: 4, Failures: 0, Skips: 0
===============================================
@Factory与@DataProvider区别
通过上述@Factory的例子,可能会联想到TestNG的@DataProvider,但两者的区别也是比较明显的。
@DataProvider:为测试用例提供参数,有多少组参数就会执行多少次用例,因此它是让一个测试类实例的某个方法执行多次,每次执行都是同一个实例。
@Factory:创建一个测试类的多个实例,每个实例中的所有测试用例都会被执行,每次执行采用的是不同实例。
Factory也可以与DataProvider结合使用。
修改上述例子的工厂测试类如下:
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
public class TestFactory {
@Factory(dataProvider = "n")
public Object[] test(int n){
Object[] object = new Object[n];
for(int i=0;i<n;i++) {
TomandyFactory tomandyFactory = new TomandyFactory(i+"");
object[i] = tomandyFactory;
}
return object;
}
@DataProvider(name = "n")
public Object[][] num(){
return new Object[][]{new Object[]{3}};
}
}
执行结果如下:
TomandyFactory: 0
TomandyFactory1: 0
TomandyFactory: 1
TomandyFactory1: 1
TomandyFactory: 2
TomandyFactory1: 2
===============================================
All Test Suite
Total tests run: 6, Failures: 0, Skips: 0
===============================================