比如說“登錄”,可以劃分為:
A.“獲取登錄頁面”、“輸入用戶名”、“輸入密碼”、“提交”四個指令
也可以不進行劃分
B.就一個“登錄”指令,包含A中所有步驟,只是將“登錄URL”,“用戶名”,“密碼”作為參數暴露
這里我傾向于B的分法,也就是說“將一個流程作為一個指令,將流程中所涉及的所有可變因素作為指令的參數暴露”。這樣,我們只要對每個流程做好封裝,以后就可以一勞永逸地重復使用它。
從技術的角度來看,我們可以定義一個接口,并將可供用戶使用的指令放置其中。代碼如下:
/*****************************************代碼分割線*****************************************/
/**
* 遙控器
* @author leizang.cs
*
*/
public interface ActionCommand {
/**
* 用戶登錄
* @param url 登錄url
* @param nick 用戶名
* @param passWord 密碼
*/
public void login(String url, String nick, String passWord);
/**
* 退出
*/
public void loginOut();
/**
* 執行訂購
* @param subOption 訂購入參
*/
public void doSub(SubOption subOption);
/**
* 訂購成功后校驗數據庫
* @param dbCheckOption 校驗入參
* @param needCheckedTables 需要校驗的表格
*/
public void checkSubDB(SubDbCheckOption dbCheckOption, TableEnum...needCheckedTables);
/**
* 數據庫修改或刪除
* @param sql 需要執行的sql
*/
public void dbExecute(String... sqls);
}
/*****************************************代碼分割線*****************************************/
這樣我們第一個問題就解決了。下面來看第二個問題。
<!--[if !supportLists]-->2、 <!--[endif]-->制造商困擾之二——機器人問題
機器人可以正確執行遙控器發出的各種指令。從技術的角度說就是要求測試框架搭建人員,正確、穩定地實現遙控器中的各種指令。至于如何實現,這跟具體的產品線功能有關,這里僅給出我實現的部分代碼,僅供參考:
/*****************************************代碼分割線*****************************************/
public class ActionCommandImpl implements ActionCommand{
private WebDriver driver;
private JdbcTemplate jdbc;
@Override
public void dbExecute(String... sqls){
for(String sql: sqls){
jdbc= CommonUtil.getJdbcFromSql(sql);
jdbc.execute(sql);
}
}
@Override
public void login(String url, String nick, String passWord){
try{
driver= new HtmlUnitDriver();
driver.get(url);
WebElement userName= driver.findElement(By.id("TPL_username_1"));
userName.sendKeys(nick);
WebElement passWd= driver.findElement(By.name("TPL_password"));
passWd.sendKeys(passWord);
WebElement submit= driver.findElement(By.className("J_Submit"));
submit.click();
}finally{
writePage();
}
}
@Override
public void loginOut(){
driver.quit();
}
/**
* @dscription 訂購接口
* @param subOption 訂購參數
* @throws ITestException
*/
@Override
public void doSub(SubOption subOption)throws ITestException{
if(subOption== null){
Assert.fail("訂購參數不能為空!");
}
String subUrl= subOption.getSubUrl();
CycleEnum cycle= subOption.getCycle();
log("傳入參數為:");
look(subOption);
if(subUrl== null || subUrl.isEmpty()){
Assert.fail("訂購Url不能為空!");
}
if(cycle== null){
Assert.fail("訂購周期不能為空!");
}
try{
driver.get(subUrl);
log("\n獲取頁面:"+ subUrl);
WebElement period= null;
switch(cycle){
case ONE_MONTH:
period=driver.findElement(By.id("p-month"));
period.setSelected();
break;
case ONE_SEASON:
period=driver.findElement(By.id("p-season"));
period.setSelected();
break;
case HALF_YEAR:
period=driver.findElement(By.id("p-half"));
period.setSelected();
break;
原文轉自:http://www.anti-gravitydesign.com