Java自動化測試框架-07 – TestNG之Factory篇 – 歡快暢遊夢幻工廠(詳細教程)
- 2019 年 11 月 6 日
- 筆記
簡介
最近忙著裝修部落格園,沒時間更新文章,今天終於抽出時間把上次寫的一半的文章給寫完了,新的部落格園風格,希望大家喜歡。今天繼續介紹testng的相關知識–工廠。
工廠允許你動態的創建測試。例如,假設你需要創建一個測試方法,並用它來多次訪問一個web頁面,而且每次都帶有不同的參數:
@Factory註解從字面意思上來講就是採用工廠的方法來創建測試數據並配合完成測試,其主要應對的場景是:對於某一個測試用例或方法,我們需要輸入多個測試數據進行測試,並且這些測試數據可以是有一定關係(可以通過程式碼控制),此時,我們就可以把自動化或者手動測試時的遇到的只因測試數據不同的多個測試用例合併成一個測試用例,來進行更方便和快捷的測試。
對編寫自己主動化測試程式碼人員節省了非常多時間
策略:一般我們會在標有@Factory註解的方法中對測試類進行調用,這時TestNg會自動調用測試類中帶有@Test註解的方法
配置文件:只需要配置帶有@Factory註解的類即可
@Factory必須放在一個返回對象數組的頂部,所有的這些對象都包含測試類的實例,testng會確保@Factory只被調用一次。
@Factory方法是首先被調用的,在@Test方法和配置方法之前,只有當所有的@Factory方法被調用之後,testng才開始執行配置和測試方法。
@Factory允許在運行時動態測試。
上邊說了這麼多是不是把大家說的雲里霧裡,暈頭轉向的,接下來通過具體的例子給小夥伴和同學們分享一下。
實例
為什麼要使用@Factory註解呢,先來看下面這個例子
被測試類Person:
參考程式碼:
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配置文件中必須這樣配置:
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註解
如果使用@Factory註解,就比較簡單,而且方便擴展,示例如下。
不需改動原有類,添加一個新類PersonFactory
新類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類即可,原類不用管。
testng.xml
參考程式碼
<?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的運行原理
1、如果不使用@Factory,運行普通的被@Test標註的方法時,實際上是TestNG框架調用了該類的構造函數構造出一個對象,然後再執行對象的這個方法。
2、使用了@Factory後,可以看到被@Factory標註的方法返回了一個Object數組,數組中每一個元素是一個被測試類的對象。也就是說@Factory構造了多個被測試類對象,然後把每一個對象都傳遞給了TestNG框架,然後TestNG框架在分別執行這些對象中被@Test標註的方法。
通過上面的描述,我們就知道了@Factory可以幫助我們實現簡單的數據驅動測試(根據測試數據,執行對應的程式)。
小結
好了,今天關於工廠的知識就分享這麼多。