比如说“登录”,可以划分为:
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;