序言:基于RFT的swing界面的自動化測試,這里不是說怎么去使用工具,而是怎么將RFT融入到自動化測試設計中,其實RFT在整個設計中,個人覺得,只是一個輔助的角色,如果時間允許的話,誰也不想用這么昂貴還這么不靈活的RFT,接下來,你讀完這個系列后,你就知道為什么我這么說了。
一、簡易自動化測試架構說明
很多人都應該了解了GUI自動化測試的通用架構劃分如下:
1、對象層AppObject,存儲基于find()搜索控件的具體方法,我分成了兩大類,一類是通用的基本java控件、一類的不同產品線的相應的自己拓展的控件類。
2、方法層AppLib,存儲簡單的操作函數,在這里,我分成了兩大類:Lib與Method類,Lib類用于對象的基本操作方法,Method類存儲用于一些基本的自己拓展的操作方法,例如:外部文件讀寫操作、日志寫出操作、模擬鍵盤鼠標操作(Robot類拓展)等。
3、用例層AppCase,調用測試方法進行測試用例的組織,不同的產品線對應不同的測試集,一個簡單的測試功能模塊對應一個測試用例。
二、簡易自動化測試架構的實例
以下可以看一個整體的簡單實例操作:
1、AppObject文件夾中有一個object.java文件,存儲一系列的通用的控件查找方法:
實例如下:
////////按鈕組件////////// //用于搜索其上的按鈕 //輸入:按鍵名稱 //類別:GuiTestObject public GuiTestObject getButton(String buttonName) { RootTestObject root = getRootTestObject(); TestObject[] to = root.find(atDescendant(".class","javax.swing.JButton","accessibleContext.accessibleName",buttonName)); return new GuiTestObject(to[0]); } ///////文本框組件////// //用于搜索文本輸入框 //輸入:無 //類別:WTextField public WTextField getTextField(String LabelName) { RootTestObject root = getRootTestObject(); TestObject[] to = root。find(atDescendant(".class","javax.swing.JTextField",".priorLabel",LabelName)); return new WTextField(to[0]); } |
說明:
a、GuiTestObject是直接繼承于RFT的所有對象的父類TestObject,其里面包含了一些簡單的操作,而我只想用Button的click方法,所以我這里就直接返回的是GuiTestObject類。
b、RootTestObject也是直接繼承與RFT的 TestObject,不過它與GuiTestObject類不同的是,它是直接指向被測的應用程序的,即是被測試應用程序的控件的一個全部的view,是按數據結構中的樹的方式進行儲存的,其中有方法為find(),可以基于屬性用來在這個RootTestObject中查找你所需要的控件。
c、find()方法查找的方式有三種,我重點說一下 atChild與atDescendant,前者是在查找根節點的直接子對象、而后者是查找所有的子對象。后面當然是要查找的控件的具體的屬性了,在這里,我們可以定義一個基本不變的屬性,然后定義一些需要在測試用例中改變的屬性,例如:按鈕,這里我設計的就是基于按鈕名字來進行查找了,如果名字一樣的話,你就得用一個別的方式了,例如:index。
d、WTextField是IBM的ITCL提供的一些控件包裹類,其實就是繼承了一些RFT的基本類,然后自己寫了一些方法而形成的類罷了,你也可以自己拓展一些控件類嘛。
2、AppLib文件夾中有一個Lib。java的文件,其類存儲對查找到的控件對象操作的基本方法。
實例如下:
//下面是對對象的初始化 public AppObject.Rc_Object getObject = new AppObject.Rc_Object(); //下面是對共同方法的實例化 public AppLib.Rc_Method getMethod = new AppLib.Rc_Method(); //////////////////////按鈕組件操作///////////////////////////// //采用動態搜索的方法進行找到Button組件,并且執行click操作 //輸入:ButtonName public void ChooseButton (String buttonName) { getObject.getButton(buttonName).click(); sleep(3); try { //向外部日志寫其完成測試的步驟 getMethod.logWriter("完成"+ buttonName + "的ChooseButton方法;"); } catch (Exception e) { //可以調用異常處理模塊進行異常處理 } } //////////////////////文本框組件操作///////////////////////////// //采用動態搜索的方法進行找到TextField組件,并且執行click操作 //輸入:TextFieldName public void ChooseTextField (String LabelName,String TextName) { sleep(3); getObject.getTextField(LabelName).setText(TextName); //用JAVA的語句將其UserName拆分成一個一個的字符進行輸入 try { getMethod.logWriter("完成" +LabelName+" ChooseTextField方法"); } catch (Exception e) { //可以調用異常處理模塊進行異常處理 } } |
原文轉自:http://www.uml.org.cn/Test/201306243.asp