最近忙着裝修博客園,沒時間更新文章,今天終於抽出時間把上次寫的一半的文章給寫完了,新的博客園風格,但願你們喜歡。今天繼續介紹testng的相關知識--工廠。java
工廠容許你動態的建立測試。例如,假設你須要建立一個測試方法,並用它來屢次訪問一個web頁面,並且每次都帶有不一樣的參數:web
@Factory註解從字面意思上來說就是採用工廠的方法來建立測試數據並配合完成測試,其主要應對的場景是:對於某一個測試用例或方法,咱們須要輸入多個測試數據進行測試,而且這些測試數據能夠是有必定關係(能夠經過代碼控制),此時,咱們就能夠把自動化或者手動測試時的遇到的只因測試數據不一樣的多個測試用例合併成一個測試用例,來進行更方便和快捷的測試。數組
對編寫本身主動化測試代碼人員節省了很是多時間框架
策略:通常咱們會在標有@Factory註解的方法中對測試類進行調用,這時TestNg會自動調用測試類中帶有@Test註解的方法函數
配置文件:只須要配置帶有@Factory註解的類便可測試
@Factory必須放在一個返回對象數組的頂部,全部的這些對象都包含測試類的實例,testng會確保@Factory只被調用一次。ui
@Factory方法是首先被調用的,在@Test方法和配置方法以前,只有當全部的@Factory方法被調用以後,testng纔開始執行配置和測試方法。this
@Factory容許在運行時動態測試。spa
上邊說了這麼可能是不是把你們說的雲裏霧裏,暈頭轉向的,接下來經過具體的例子給小夥伴和同窗們分享一下。3d
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能夠幫助咱們實現簡單的數據驅動測試(根據測試數據,執行對應的程序)。
好了,今天關於工廠的知識就分享這麼多。