自动测试之关键字驱动测试模式初探(3)

发表于:2012-12-28来源:淘测试作者:雷藏点击数: 标签:关键字驱动
case ONE_YEAR: period=driver.findElement(By.id(p-half)); period.setSelected(); break; default: Assert.fail(入参中周期值不合法!); } WebElement isAgree= driver.findElement(By.id(J_Agreement));

  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.ltesting.net