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中定义的变量,也可以在界面中进行关联、维护。