case ONE_YEAR:
period=driver.findElement(By.id("p-half"));
period.setSelected();
break;
default:
Assert.fail("入參中周期值不合法!");
}
WebElement isAgree= driver.findElement(By.id("J_Agreement"));
isAgree.click();
((HtmlUnitDriver)driver).setJavascriptEnabled(true);
String js= "document.getElementById(\"J_PayMoney\").disabled = false";
((HtmlUnitDriver)driver).executeScript(js);
log("執行JS:"+ js);
WebElement payMoney= driver.findElement(By.id("J_PayMoney"));
String prePayUrl= driver.getCurrentUrl();
payMoney.click();
String afterPayUrl= driver.getCurrentUrl();
if(!isPageSkip(prePayUrl, afterPayUrl)){
throw new ITestException("訂購失敗!請查看"+ DIRECT+ "目錄確認頁面信息\n");
}
WebElement bd= driver.findElement(By.className("bd"));
log("\n"+ bd.getText());
}catch(NoSuchElementException e1){
throw new ITestException(e1);
}finally{
writePage();
}
}
/**
*
* @param dbCheckOption 數據庫校驗參數
* @param checkedTables 需要校驗的表
*/
@Override
public void checkSubDB(SubDbCheckOption dbCheckOption, TableEnum...needCheckedTables){
for(TableEnum table: needCheckedTables){
log("\n");
switch(table){
case UPP_BIZ_ORDER:
checkUppBizOrder(dbCheckOption);
break;
case UPP_SUB_PLAN:
checkUppPlanSub(dbCheckOption);
break;
case UPP_PROD_SUBSCRIPTION:
checkUppProdSubscription(dbCheckOption);
break;
default:
Assert.fail("暫無此表校驗邏輯:"+ table.name());
}
}
}
/*****************************************代碼分割線*****************************************/
在這里我引入了JAVA的GUI測試技術。經過實踐證明:
<!--[if !supportLists]-->1) <!--[endif]-->對WebDriver的使用不僅方便,而且執行快速,平均一個用例5S就能運行完成
<!--[if !supportLists]-->2) <!--[endif]-->更重要的是測試代碼完全獨立于開發代碼,測試環境最接近真實的手工測試環境,用這種方法實現的自動化,只是模擬手工測試工作,并將其自動進行
<!--[if !supportLists]-->3) <!--[endif]-->指令正確實現以后,編寫用例相當快捷方便,大大提高用例編寫效率
<!--[if !supportLists]-->4) <!--[endif]-->腳本穩定、健壯且易于維護,只要頁面不發生變化,對指令的實現就無需變化,大大降低維護成本
這樣,上面提出的兩個問題就解決了,我們編寫出的代碼就會像第一節所示的一樣,只要準備好相關數據,發發指令就可以了。下面我們來解決用戶的困擾。
<!--[if !supportLists]-->3、 <!--[endif]-->用戶的困擾——數據準備問題
還記得上節劃分指令粒度的時候我們是按流程來劃分的嗎?在這里它的好處就體現出來了。我們把一個流程作為一個指令,將流程中涉及的可變因素作為參數暴露,并將指令在接口中定義,實現與定義分開,這樣對于每一個指令來說,其參數個數是固定的,而且對于每條產品線來說指令的個數也比較有限。這非常有利于我們將其“模板化”。說到模板化,大家自然會想到界面,于是就有三種方式進行模板化:“頁面”,“軟件客戶端”,“eclipse插件”。我認為最簡單、最方便的當屬“eclipse插件。”下面我給出插件示意圖:
<!--[endif]-->
最左邊①是用例的目錄樹,當選中一條用例后第②部分為該用例的有序指令,第③部分為“指令池”,可以從中選擇需要的“指令”。
這樣我們編寫用例就可以分為三步:
<!--[if !supportLists]-->1、 <!--[endif]-->在①中新建一條用例并輸入用例名稱,此時第②部分應該為空
<!--[if !supportLists]-->2、 <!--[endif]-->選擇方法類型,有“@BeforeClass”,”@Before”,”@Test”,”@After”,”@AfterClass”五種選擇,并從③中選擇需要的“指令”
<!--[if !supportLists]-->3、 <!--[endif]-->
<!--[if !supportLists]-->3、 <!--[endif]-->存據填入期擊ommand錄入數據,雙擊“doSub”指令,此時彈出如下圖所示的參數錄入框,將數據填入其內并保存,保存后在eclipse中就會自動生成如第一節所列出的用例代碼,其中“SUB_PLAN_URL”為poperties中定義的變量,也可以在界面中進行關聯、維護。
原文轉自:http://www.anti-gravitydesign.com