当Selenium遇到TestNG

本文介绍了如何将Selenium与TestNG结合,创建一个分层测试框架,提高测试用例的复用性和可维护性。通过TestNG的参数化测试,实现了Web页面元素定位信息的集中管理和测试任务的参数化,从而实现不同测试场景的灵活配置。
摘要由CSDN通过智能技术生成

当Selenium遇到TestNG



用 Selenium 测试 Web 页面时,所重现的各种行为依赖于测试人员的输入参数,例如:选择下拉餐单的项目,在文本框中输入字符等。不同的测试用例对应不同的输入,若有方法能够简单 有效的传入测试用参数,会大大提高测试用例的复用性和可维护性。当 Selenium 遇到 TestNG,这些就可以实现。

@Parameters( { "url", "query-string", "btn-id", "txt-id", "verify-String" }) 
@Test 
public void testGoogle(String url, String queryString, String btnID, 
    String txtID, String verifyString) 
{ 
  selenium = new DefaultSelenium("localhost", 4444, "*firefox", url); 
  selenium.start(); 
  selenium.open("/"); 
  selenium.type(txtID, queryString); 
  selenium.click(btnID); 
  selenium.waitForPageToLoad("30000"); 
  verifyTrue(selenium.isTextPresent(verifyString)); 
  selenium.stop(); 
} 
上面的代码清单中,注释 Parameters 指定的参数在 TestNG 测试框架的配置文件 testng.xml 里有具体定义,如下所示:
testng.xml
<parameter name="url" value="http://www.google.cn"></parameter> 

<parameter name="query-string" value="developerworks"></parameter> 

<parameter name="btn-id" value="//input[@name='btnG']"></parameter> 

<parameter name="txt-id" value="//input[@name='q']"></parameter> 

<parameter name="verify-String" value="developerWorks 中国"></parameter>

只要修改 testng.xml 中的参数值,就能由输入参数驱动不同的测试用例。然而,仅仅在 testng.xml 中指定参数有很大的局限性,显然过多的参数会难以维护,
无法井井有条地组织分属不同 Test Cases 的输入。在下文中,我们来解决这个问题。

基于 Selenium 的分层测试框架

Test Suite 包含三类 Test Cases(谷歌百度与必应),每类 Test Cases 的一个 Test Case 由若干可复用的 Test Tasks 组成,通过传入不同的参数,Test Task 完成同质的不同行为。在 Test Task 之下,定义相关文件,包含待测试的 Web 页面元素的定位信息。因此,分层 Selenium 框架有三个层次:

appObjects —— Web 页面元素定位信息,如按钮与文本框等;

  tasks ——测试步骤中可复用的行为;

  test cases ——由 tasks 组成的测试用例。

  Web 元素 locators 定义与收集

  Selenium 根据 XPath 来定位 Web 元素,XPath 的相关知识不属于本文的内容。前面例子中,在 TestNG 的配置文件 testng.xml 里定义文本框与按钮的 locators,对于复杂的测试场景而言,这不是好的实践。因此,我们在 appObjects 层建立文件,将 Web 页面元素 locators 归入,便于维护使用。Selenium-IDE 的 Find 功能适于完成这一步骤。文件 googlePages.properties 的内容如下:

清单 7. locators 文件示例

#define the keys and corresponding XPaht locators of google page. 
googleSearchTxtField=//input[@name='q'] 
googleSearchBtn=//input[@name='btnG'] 

  这时,在 testng.xml 中,删去 locators 相关的 parameters,只需要解析 .properties 文件,生成 locators 的 properties 备用。在所附的源码中可以看到 .properties 文件的解析器 PropUtils 的简单实现。

  测试任务分解与实现

  为说明任务分解,以简单的搜索过程为例,可以分为输入搜索关键字、点击搜索按钮、以及验证结果页面。实际代码如下所 示,不难发现,由参数决定行为方式的测试任务,都接受一个 paraMap 数据结构,并根据其内容在方法内采取适当的行为。通过这种方式,test cases 能够以参数配置文件来驱动测试任务实施其想要的行为。

清单 8. Test Task 代码示例

public void openSite() { 
  selenium.open("/"); 
} 
 
public void typeSearchTxtField(HashMap<String, Object> paraMap) 
{ 
  utils.waitForElement((String) elemMap 
    .get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD), 30); 
  selenium.type((String) paraMap 
    .get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD), 
    (String) elemMap 
    .get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD)); 
 } 
 
public void clickSearchBtn() { 
  utils.waitForElement((String) 
  elemMap.get(TestGoogleConstants.GOOGLE_SEARCH_BTN), 30); 
  selenium.click((String) elemMap.get(TestGoogleConstants.GOOGLE_SEARCH_BTN)); 
} 
 
public void verifyResult(HashMap<String, Object> paraMap){ 
  stc.verifyTrue(selenium.isTextPresent((String) 
    paraMap.get(TestGoogleConstants.VERIFY_STRING))); 
} 

  clickSearchBtn 方法无需参数输入,因为其任务只是点击搜索按钮,在 test cases 需要时调用即可。这里只是以一个简单的例子说明如何分解任务,对于实际的 test case,这个过程会复杂许多,但其后的复用与灵活调用完全值得这些工作的付出。

  Test Cases 实现与 Test Tasks 调用

  Test Cases 作为一系列测试步骤的集合,可以通过调用若干 Test Tasks 实现。以贯穿本文的搜索引擎为例,以此调用上一部分定义的 test taskss,重现整个测试过程。简单代码如下所示。

清单 9. Test Case 代码示例

@Parameters( { "google_se_para_1" }) 
@Test 
public void testGoogle_1(String paraFile) 
{ 
  paraMap = (HashMap<String, Object>) XMLParser.getInstance() 
    .parserXml(paraFile); 
  tgTasks.openSite(); 
  tgTasks.typeSearchTxtField(paraMap); 
  tgTasks.clickSearchBtn(); 
  tgTasks.verifyResult(paraMap); 
} 

Test Cases 在分层 Selenium 测试框架下,就是按照要求调用已有的 Test Tasks。值得注意的是,在上面两个代码列表里的 paraMap 参数。这个哈希表由我们实现的解析器解析参数定义文件而得到。TestNG 的 Parameters 参数机制,使得 Test Cases 能够灵活地指定参数文件,从而驱动不同的 Test Cases。

清单 10. 参数定义文件示例

<?xml version="1.0" encoding="UTF-8"?> 
<fvt_element> 
  <!-- Search String--> 
  <arg id="googleSearchTxtField"> 
    <value>developerworks</value> 
  </arg> 
  <arg id="verify-String"> 
    <value>developerWorks 中国 </value> 
  </arg> 
</fvt_element> 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值