最近忙着装修博客园,没时间更新文章,今天终于抽出时间把上次写的一半的文章给写完了,新的博客园风格,但愿你们喜欢。今天继续介绍testng的相关知识--工厂。html
工厂容许你动态的建立测试。例如,假设你须要建立一个测试方法,并用它来屡次访问一个web页面,并且每次都带有不一样的参数:java
@Factory注解从字面意思上来说就是采用工厂的方法来建立测试数据并配合完成测试,其主要应对的场景是:对于某一个测试用例或方法,咱们须要输入多个测试数据进行测试,而且这些测试数据能够是有必定关系(能够经过代码控制),此时,咱们就能够把自动化或者手动测试时的遇到的只因测试数据不一样的多个测试用例合并成一个测试用例,来进行更方便和快捷的测试。web
对编写本身主动化测试代码人员节省了很是多时间数组
策略:通常咱们会在标有@Factory注解的方法中对测试类进行调用,这时TestNg会自动调用测试类中带有@Test注解的方法框架
配置文件:只须要配置带有@Factory注解的类便可函数
@Factory必须放在一个返回对象数组的顶部,全部的这些对象都包含测试类的实例,testng会确保@Factory只被调用一次。测试
@Factory方法是首先被调用的,在@Test方法和配置方法以前,只有当全部的@Factory方法被调用以后,testng才开始执行配置和测试方法。ui
@Factory容许在运行时动态测试。this
上边说了这么可能是不是把你们说的云里雾里,晕头转向的,接下来经过具体的例子给小伙伴和同窗们分享一下。spa
package hongge; /** * @author 北京-宏哥 * * Java自动化测试框架-07 - TestNG之Factory篇 * * 2019年11月6日 */ import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class Person { String name; int age; @Parameters({"name","age"}) public Person(String name, int age) { super(); this.name = name; this.age = age; } @Test() public void say() { System.out.print("我是"+name+" "); if(age<18){ System.out.println("我未成年"); }else if(age>=18&&age<=45){ System.out.println("我是青年人"); }else if(age>45&&age<=60){ System.out.println("我是中年人"); }else if(age>60){ System.out.println("我是老年人"); } } }
该类的say()方法中有四个判断分支,为了测试充分,必须执行四次这个方法,若是不使用@Factory注解,在TestNG配置文件中必须这样配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"> <test name="Test1"> <parameter name="name" value="小明" /> <parameter name="age" value="10" /> <classes> <class name="hongge.Person" /> </classes> </test> <test name="Test2"> <parameter name="name" value="宏哥" /> <parameter name="age" value="20" /> <classes> <class name="hongge.Person" /> </classes> </test> <test name="Test3"> <parameter name="name" value="刘创" /> <parameter name="age" value="50" /> <classes> <class name="hongge.Person" /> </classes> </test> <test name="Test4"> <parameter name="name" value="爷爷" /> <parameter name="age" value="70" /> <classes> <class name="hongge.Person" /> </classes> </test><!-- Test --> </suite> <!-- Suite -->
从上边咱们能够清楚地看出来:参数一旦多起来,就难以管理了,因此应该使用工厂来作
若是使用@Factory注解,就比较简单,并且方便扩展,示例以下。
不需改动原有类,添加一个新类PersonFactory
package hongge; import java.util.ArrayList; import org.testng.annotations.Factory; /** * @author 北京-宏哥 * * Java自动化测试框架-07 - TestNG之Factory篇 * * 2019年11月6日 */ public class PersonFactory { @Factory public Object[] factory() { ArrayList<Person> testList = new ArrayList<>(); Person tp = new Person("明明",10); testList.add(tp); Person tp2 = new Person("宏哥",20); testList.add(tp2); Person tp3 = new Person("刘创",50); testList.add(tp3); Person tp4 = new Person("朱爷爷",70); testList.add(tp4); return testList.toArray(); } }
运行时,能够在Eclipse中,在这个factory类(PersonFactory)上点击右键,Run As-> TestNg test执行,
也能够配置在testng.xml中,只须要配置factory类便可,原类不用管。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"> <test name="Test1"> <classes> <class name="hongge.PersonFactory" /> </classes> </test><!-- Test --> </suite> <!-- Suite -->
你的testng.xml 只须要引用包含工厂方法的类,而测试实例本身会在运行时建立:
<class name="WebTestFactory"/>
工厂方法能够接受诸如 @Test 和 @Before/After 所标记的参数,而且会返回 Object[]。这些返回的对象能够是任何类(不必定是跟工厂方法相同的类),而且他们甚至都不须要TestNG注解(在例子中会被TestNG忽略掉)
一、若是不使用@Factory,运行普通的被@Test标注的方法时,其实是TestNG框架调用了该类的构造函数构造出一个对象,而后再执行对象的这个方法。
二、使用了@Factory后,能够看到被@Factory标注的方法返回了一个Object数组,数组中每个元素是一个被测试类的对象。也就是说@Factory构造了多个被测试类对象,而后把每个对象都传递给了TestNG框架,而后TestNG框架在分别执行这些对象中被@Test标注的方法。
经过上面的描述,咱们就知道了@Factory能够帮助咱们实现简单的数据驱动测试(根据测试数据,执行对应的程序)。
好了,今天关于工厂的知识就分享这么多。
原文出处:https://www.cnblogs.com/du-hong/p/11730930.html