在ui自動化測試過程當中,目前存在最大的缺陷就是若是產品的ui或者結構改了那麼這個項目進行的自動化測試腳本可能要面臨全面維護。這也是目前ui自動化面臨的很讓人崩潰的事情。所以如今不少互聯網產品項目發現ui自動化在測試中的價值愈來愈小,由於互聯網產品的迭代太快,自動化測試組每每剛剛完善了自動化腳本,項目也跑起來了。忽然來了項目大改版,崩潰啊,這意味這代碼要從新進行維護,並且維護成本很高。可能維護完了產品需求又改了,每每跟不上腳步。所以我UI自動化比較適合如下兩種狀況的項目:1.產品原型趨於穩定階段,2.手機固件項目(由於手機固件是在原生安卓上修改的,原生安卓的的系統構架一般短期內不多會作重大改版,即便小改動也是一年一次)。
之前咱們的自動化項目都是趨於關鍵字驅動,數據和代碼是揉雜在一塊兒的。咱們寫自動化測試用例的流程大概是這樣的(以魅族社區發帖舉例子只走流程不包括斷言):點擊發帖按鈕—輸入標題—輸入正文—點擊發送按鈕
代碼以下:數據庫
UiObject write_title=new UiObject(new UiSelector().resourceId("com.meizu.mzbbs:id/et_write_title"));post
//assertTrue("write_title focusable is false", write_title.isFocused()==true); Configurator config = Configurator.getInstance(); config.setKeyInjectionDelay(40); write_title.setText(Utf7ImeHelper.e(「帖子標題」)); sleep(2000); UiObject richet_post=new UiObject(new UiSelector().resourceId("com.meizu.mzbbs:id/richet_posts")); richet_post.click(); sleep(2000); //assertTrue("richet_post focusable is false", richet_post.isFocused()==true); richet_post.setText(Utf7ImeHelper.e(「帖子正文」)); config.setKeyInjectionDelay(0); sleep(2000); UiObject send_post=new UiObject(new UiSelector().resourceId("com.meizu.mzbbs:id/action_send_posts")); send_post.clickAndWaitForNewWindow(3000); sleep(3000);
這樣測試流程走通了,可是如過遇到如下問題1.resourceId改變了或者控件名稱改變了(uiautomator也能夠用控件名稱定位控件)這就意味着我須要在代碼中修改這些控件資源id或者name了。2.原始流程是A-B-C這種固定流程,萬一流程中添加了F步驟變成A-F-B-C了,意味着在中間要插入一段代碼,在無數行代碼中找到這段代碼而後插入,這樣必定是很麻煩的並且還要調試。3.若是這個功能不要了意味着這些倖幸苦苦寫的代碼就白寫了。相信以上問題都是你們在自動化測試實踐過程當中所到很蛋疼的問題。這也是爲何現階段你們愈來愈對ui自動化持懷疑態度了,由於隨着產品的持續迭代維護成本愈來愈高,進而轉向接口自動化的緣由。
那麼爲了解決以上問題,因此如今又出現了一種趨於數據驅動的自動化模型,就是將測試代碼和測試數據分開來,作到代碼和數據獨自開來這樣每次迭代咱們只須要修改測試數據和少許測試代碼就能對自動化測試腳本進行很好維護,同時能減小代碼量,經過對方法的二次封裝能夠簡化自動化測試的難度,使新手能更快的入手。整個設計思路爲:將測試控件的資源id或者name和操做類型保存在excel表格或者數據庫中,而後代碼去讀取excel表格中的控件資源數據做爲參數傳給操做代碼。最後經過判斷操做類型作出相應的操做,以上實現方法以魅族社區發帖步驟爲例:
1.如今用excel創建一個管理測試數據的表格測試
2.獲取表格中的資源id和操做方式數據主要方法以下:ui
public List<String> readXls(int rowNun)throw Exception{this
String path="F:/test.xls" File file = new File(path); InputStream is =new FileInputStream( //默認第一個表格 HSSFSheet sheet = wb.getSheetAt(0); HSSFRow row = sheet.getRow(rowNun); int minColIx=row.getFirstCellNum(); int maxColIx=row.getLastCellNum(); List<String> result=new ArrayList<String>(); //過濾掉第一列和第二列數據 for(int collx=minColIx+2;collx<maxColIx;collx++){ HSSFCell cell=row.getCell(collx); if(cell==null){ continue; } result.add(ExcelUtils.getStringVal(cell)); } return result;
}
3.獲取到數據後供uiautomator定位控件方法調用,接下來咱們對獲取的數據進行調用操做:
/*
經過判斷操做類型來調用不一樣的用例方案
rowNum 讀取數去行數
**/
public void testUI(int rowNum)throw Exception{spa
//還能夠定義其餘類型的操做(如:長按等)在裏面這裏只舉例兩種 if((String)this.readXls(rowNum).get(1).equals("單擊")){ UiObject click=new UiObject(new UiSelector().resourceId((String)this.readXls(rowNum).get(0))); richet_post.click(); sleep(2000); } else if((String)this.readXls(rowNum).get(1).equals("輸入")){ UiObject editText=new UiObject(new UiSelector().resourceId((String)this.readXls(rowNum).get(1))); Configurator config = Configurator.getInstance(); config.setKeyInjectionDelay(40); search_movies1.setText(Utf7ImeHelper.e((String)this.readXls(rowNum).get(2))); config.setKeyInjectionDelay(0); }
}
這樣全部的工做都準備好了,咱們設計測試用例定位控件操做時只要按照邏輯重複的調testUI(int rowNum)方法就行,只需修改rowNum參數,它會按照操做類型自動幫你調不一樣類型的操做。並且能夠發現測試數據和代碼都分離出來了。若是改了ui界面控件咱們只需在excel表格中修改測試數據就行,就算項目大修改代碼維護起來工做量也不是很大,並且操做邏輯上很靈活。(未完待續)。設計