超越Selenium的Web自动化测试:Geb技术

发表于:2020-2-10 19:24  作者:陈涛   来源:软件质量报道

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: Selenium

  现如今,随着互联网技术在全球范围内的迅速发展,各种基于Web的应用程序也已经成为软件开发的主流。围绕如何更好、更有效的测试Web应用的技术也是层出不穷。Geb是近年来提出的一种比较有效的Web测试新技术,它让自动化测试脚本编写工作变得简单、直接,同时,它捕捉Web页面元素更加准确、有效。
  本文将从Geb技术的原理、特点、最佳实践等方面展开讨论。
  1.Geb的工作原理
  Web自动化测试就是站在用户的角度测试Web服务程序业务逻辑的正确性。测试的重点是围绕Web服务暴露的接口检查接口数据的正确性。这个过程是将Web服务程序当做黑盒,通过自动化测试技术提高测试执行的效率,降低人工回归的成本。因此,任何Web自动化测试工具都离不开定位页面元素、获取页面元素信息以及操作页面元素三个核心要素。
  目前比较流行的的Web自动化测试工具是selenium。Selenium提供了各种工具库用来在各种浏览器里实现Web页面自动化测试来达到模拟人工页面操作的目的。Selenium的核心是WebDriver,如图 1所示。有关Selenium的详细信息请参阅其官方网站是https://selenium.dev/, 这里就不再赘述。
  图1
  Geb是众多Web自动化测试开源工具中的一种。其官方网站https://gebish.org/上有很多权威的介绍和使用文档。Geb是一款面向开发者的页面自动化测试工具,它的核心是在selenium的基础上做了进一步的封装(如图 2所示),能让我们用jQuery的方式描述、锁定并操作Web页面元素。同时,它又借助Groovy语言的动态特性构建了一个可复用页面内容的建模、功能强大的领域特定语言(DSL)。Geb能使开发者在页面自动化的过程中更加关注页面内容和交互。
  图2
  Geb 底层是基于 WebDriver 浏览器的自动化库,这就意味着凡是WebDriver 支持的浏览器Geb 都能支持。尽管 Geb 在 WebDriver 上包装了一个方便、高效、极具生产力的功能层,但如果你需要直达底层的 WebDriver 去做一些直接的操作也是很容易的。
  2. Geb的特点
  使用Geb之前,我们大部分的Web自动化测试用例都是基于Selenium开发的。但很长一段时间以来,在我们的日常工作中,经常会遇到由于各种原因导致的自动化测试脚本运行失败的问题。原因有很多,有些是服务器未在规定的时间内相应,导致没有找到页面元素;有些是上一次的测试出现状况,导致后面的测试运行在非期望的页面上;还有些,就是测试脚本自身的不稳定导致的;等等等等。
  在这里,让我们通过下面这段我们之前编写的代码先来体会一下。首先,WebDriver指定为FirefoxDriver。如果我们想把测试用例运行在其它浏览器上就需要更改代码。其次,等待页面元素的加载时间也被限定在10秒。如果10秒的等待时间还不够,需要额外的等待时间,也必须修改代码。另外,页面元素是通过xPath的方式来锁定的,xPath往往比较复杂。如果产品的页面变化了,测试代码就要做相应的改动,尤其是这些xPath表达式。从这些简要的分析来看,相信你能体会出我们的痛点所在,也相信能引起你的共鸣。
  为了让这些测试稳定,我和我的自动化测试团队花了大量的时间维护这些自动化测试用例,但收效却不理想。而且,最致命的是一旦产品有改动,测试用例的维护工作往往是巨大的。有时候,产品的页面元素由于各种原因没有ID,导致自动化测试要准确寻找到这些页面元素是十分困难的,用XPath来表达一个页面元素更是复杂。
  因此,为解决这些痛点,我们最终选择了Geb来做我们Web自动化测试用例的解决方案。Geb有很多Selenium不能提供的优秀特性,下面我们就把它们一一罗列出来供参考。
  jQuery风格导航器API
  Geb有一个特别吸引人的优势就是它能用jQuery的方式表达一个或多个页面元素。在 Geb 中,页面元素使用 $()函数进行选择和定位,它返回一个导航器对象(Navigator)。导航器对象(Navigator)从某种意义上讲类似于 jQuery 中的 jQuery 数据类型,它代表了页面上的一个或多个目标元素。让我们看看下面这些示例代码来体会一下。
  所有这些方法都返回Navigator对象。该对象可以用来进一步捕获页面内容。
  $("p",0).parent()   //匹配页面上第一个p元素的父元素
  $("p").find("table",cellspacing: ‘0’)  //匹配p元素下所有cellspacing属性为0的table元素
  Geb集成了Groovy语言的动态特性
  Geb集成了Groovy语言的很多动态特性,我们用具体的例子来做体会。
  Navigator对象调用Groovy工具函数
  Navigator对象实现了Java的Iterable接口,这样就能让你在获取Navigator对象后调用很多Groovy语言提供的工具方法。例如有段HTML的内容是下面这样的。
   <p>1</p>
  <p>2</p>
  那么,你就可以调用max()方法求最大值。
 assert $("p").max { it.text()}.text()=="2"
  同样,你也可以使用Groovy提供的点差算子来做迭代运算。
 assert $("p")*.text().max()=="2"
  Groovy点差算子
  关于点差算子,还有很多例子。例如有段HTML的内容如下。
   <p title="a" class="a para">a</p>
  <p title="b" class="b para">b</p>
  <p title="c" class="c para">c</p>
  为获取特定行的文本信息我们可以这样做。
 assert $(".a").text()=="a"
  同时,我们也可以获取所有行的文本信息并把它们放到一个字符数组里面。
 assert $("p")*.text()==["a","b","c"]
  Groovy闭包
  页面元素的定义采取了Groovy的闭包设计,即页面内容的定义格式如下。
《name》{《definition》}
  例如,有段HTML的内容如下。
 <div id="a">a</div>
  相对应的Geb页面定义代码如下。
   class PageWithDivextendsPage{
  static content ={
  theDiv { $('div', id:'a')}
  }
  }
  At检测器
  我们知道,用Selenium作Web自动化测试的时候,经常会发现:表面上看执行失败是没有准确捕获到页面元素导致的,但其实更深层次的原因是当前打开的页面并非期望的页面。要准确定位这类问题,只有单步调试,同时还要不断关注当前打开的页面才能发现。为了规避或提前预警这类问题,我们就要在所有页面自动测试用例开始的阶段(例如setUp或BeforeClass)加入检测代码,判断当前页面是否是期望的页面。
  Geb有一个很好的功能就是at检查器。也就是说,在每一个页面的定义(Page Object)中,我们可以加入at检查器用于判断当前打开的页面是否在期望的页面上。这样一来,如果当前打开的页面不是我们期望页面的话,我们就能在测试运动的过程中得到断言失败异常AssertionError,用于警示当前打开了错误的页面。
   class PageWithAtCheckerextendsPage{
  static at ={ $("h1").text()=="Example"}
  }
  当然,从上面的代码例子能看出,at检测器主要是通过判断当前页面的一些关键要素是否存在来进行的。这些页面关键要素的判断粒度完全取决与编写自动化测试用例的人员。理论上可以把所有页面元素当做关键要素。
  Page页面对象
  Geb提供了Page页面对象,当我们用面向页面的方式(Page Object Pattern)来编写我们的Web自动化测试代码时,这个功能尤其重要。从下面的示例代码我们可以看出,当前页面对象继承了Page页面对象后,我们就可以很直观而自然的定义页面内容 content,at检查器以及URL等。
  由此可见,之所以可以用静态属性的方式来定义页面的特性是因为Page页面对象提供了页面内容content,at检查器,以及url等静态领域特定语言(DSL)。
  Module对象
  我们知道,很多产品页面上的组件,如工具栏等都是共用的,是不以页面的切换而改变的。在我们通过面向页面的方式(Page Object Pattern)来组织页面测试代码时,就需要把那些公共组件代码抽象出来,让其它的页面能很方便的调用。
  Geb提供了Module对象,使得公共代码变成模块,并在不同的页面间很方便地调用。Module对象也提供了页面内容content、base等静态领域特定语言(DSL)。
  配置
  Geb的配置十分简单,只要把配置信息放到GebConfig.groovy文件里就行了。具体的配置信息有WebDriver、Base URL、等待时间、reportsDir等等。这就可以在不需要改变代码的前提下让Web自动化测试代码运行在不同的测试环境里,甚至在不同的浏览器上。
  3. Geb的最佳实践
  安装
  Geb的安装十分简单,如果你的项目是Maven工程,只需要在pom.xml文件里添加如下依赖就好了。
  当然,如果你的项目是Gradle工程,只要在build.gradle文件里添加如下依赖就好了。
  compile "org.gebish:geb-core:3.3"
  compile "org.seleniumhq.selenium:selenium-firefox-driver:3.141.59"
  compile "org.seleniumhq.selenium:selenium-support:3.141.59"
  编写自动化测试用例
  Geb集成了很多当下流行的测试框架,比如Spock,Junit,TestNG以及Cucumber等。在这些测试框架中,Geb与Spock的集成尤其完美。从下面的代码可以看出,这种Spock + Geb的测试代码可以让你更加准确、易理解的定义你的测试用例。
  总结
  Geb是一款非常优秀的Web自动化测试工具,它的jQuery风格导航器API是其它测试工具所不能提供的。其次,Geb与Groovy语言的结合让你能利用Groovy的动态特性并很方便的编写测试脚本。另外,Geb能让你在开发Web自动化的过程中更加关注页面的实际内容和交互。总之,Geb能让Web自动化测试用例稳定、高效的运行在各种浏览器上。

     上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理

评 论

  • flyboy326 (2020-5-06 15:11:02)

    感谢编辑的改正。

  • 旺达 (2020-5-06 14:53:27)

    作者已经修正过来了哦!

  • flyboy326 (2020-5-06 11:37:05)

    这不是原创!!!
    我在2月9日发表在《软件质量报告》上的文章,第二天就被抄袭了,更加可气的是居然还改了署名。目前正在维权中。
    我在《软件质量报告》上发表链接是:https://mp.weixin.qq.com/s/jf7S5sFhVdWWYQPLgcHWDg。
    请大家支持原创,拒绝抄袭!

论坛新帖



建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海信义律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2021, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道