人人都值得学习的UI自动化

为什么需要UI自动化?

说起自动化,听着很厉害,可是也没见识过到底多厉害,基本是属于传说,没见过实战。但不能否认其价值,作者本人作为一个开发者也是偶然的机会接触到UI自动化,感受到了自动化的魅力,才不惜花时间来学习并使用在实际工作中。下面就来说一下为什么要做自动化。 自动化有很多种,单元测试,接口测试,UI测试。所有测试过程可以形成这样一个金字塔:

测试金字塔 (图片来自网络)

测试金字塔 (图片来自网络)

从图中看出底层测试简单快速,每个单元相对独立,测试成本也较低。而最顶层的UI层聚合了底层的很多接口服务,一个测试流程相对更长更复杂,也就导致了速度慢,成本高的问题。如果由人工来完成,一个完整的测试流程往往需要几分钟,而且是不停的重复这样一个流程。所以很多开发都不愿意完整的测试自己所开发的一套业务,只能由测试人员不厌其烦的循环往复。此时如果有自动化的话就非常nice了。口说无凭,一图胜千言:

自动注册

是不是还没看清?没错,平时人工测试一个报名表单需要15秒左右,而自动化后几乎一瞬间即可完成,速度提升不言而喻。如果您对UI自动化已产生兴趣,请继续往下看。

哪些场景可以UI自动化?

UI自动化的目的不是为了自动化而自动化,也并不能覆盖所有测试。还是以测试金字塔来说明:

测试金字塔

UI自动化虽然只能覆盖到约10%,但其价值却不可忽略,因为越往顶层消耗的人力成本越高,如果底层测试不够充分就只能靠顶层测试来保证。自动化虽好,但需要满足特定的场景才行,那么什么样的场景可以做UI自动化?

  • 流程变化少。侧重UI的修改,而不是流程的修改。
  • 频繁的回归测试。比如一个报名表单样式修改比较频繁,需要测试其报名是否可用。
  • 界面稳定。样式可以频繁修改,但表单顺序和个数变化较少不能频繁变更。
  • 维护周期长。如果只是使用一次那也不必自动化了,毕竟自动化是解决重复劳动。
  • 开发与测试可相互配合。自动化需要程序有一定规范便于测试人员写测试程序。
  • 测试人员具备编程能力。 如果满足了上述的场景,那么UI自动化在人力消耗和效率上就有很大的提升。正确性上更有保证,手工录入会有输错重输的情况,而自动化则不会出现。 再看一个流程比较长的页面:

自动下单

上面动图并没与快进,一气呵成完成了一次下单流程,基本不需要停留即可进入下一步,相比起手动操作省时省力。

为什么UI自动化普及率低?

既然UI自动化能提高效率,但为什么却很少有人去使用?

  • 开发自动化程序对测试人员的编程水平有一定要求,很少有人愿意花时间去写这个程序。
  • 对于互联网公司,大多数业务需要快速迭代,一个页面的生存周期很短,也可能只是一次性的,自动化测试没有存在的必要性。
  • 测试人员没有切实的感受到效率提升。

其实说白了,就是大家觉得投入和产出不值得。如果是迫于领导压力要写自动化程序,就会不停的对程序修修补补,自己用的话有问题大不了不用自动化,手动测试一下通过就行,如果是给别人用就会不停收到反馈和吐槽,自然也就没有写下去的动力了。 所以个人觉得,自动化程序不应该成为一种流程和形式,而是应该由开发和测试人员自发的去将自身经常重复的工作做成自动化。因为自动化本身就不能覆盖所有场景,只有实际参与的人才能知道哪些是可以自动化的。

有哪些工具可以选择?

目前市场上不仅提供了多种工具可以选择,还支持不同语言。 web端:selenium、webdriver、robotframework、puppeteer等。 APP端:Appium、Instrumentation、Robotium 、UIAutomator、Espresso、Calabash、Selendroid、Robolectric、RoboSpock、Cafe、Athrun等。

移动APP自动化测试框架

本文不对所有工具一一详解,可自行根据平台选择合适的工具和语言进行学习使用。只针对个别WEB端工具做简单说明。 拿selenium来说,selenium是一款很多人比较熟悉的工具,支持的语言有Python,Java,JavaScript等,推荐使用Python。而且其支持的浏览器也很全面: Google Chrome Internet Explorer 7, 8, 9, 10, 11 Firefox Safari Opera HtmlUnit phantomjs Android iOS

一些常见问题

在自动化过程中最多的就是对元素进行定位,自动化工具常见的定位符有:

  • id
  • name
  • class name
  • tag
  • link text
  • partial link text
  • xpath
  • css selector

以上这些元素定位对于以前的网页来说还足以应对,因为以前开发的网页大多数元素会有id,class这些属性,定位起来也比较方便。但是对于react,vue,angular这类数据驱动的框架就不那么友好了。 比如有这么一个元素:<div>{{element}}</div>结果为:

这个元素既没有id,也没有class,而且是使用最多的div元素,想要定位就很困难了。 而且这些元素定位支持也比较简单,不支持一些兄弟元素,父子元素的定位,我们以往使用的jquery选择器是不支持的。 所以这时候就体现出开发和测试配合的重要性了,开发测试不分家,开发需要根据测试需要的来对重要元素加明确的标识便于测试定位。 其次就是让自动化工具支持jquery,使用一些jquery的选择器来操作元素,使用方式是自动添加一个<script src="jquery"></script>标签。然后执行js脚本来实现jquery选择器。

总结

自动化的最终目的是提高测试和开发效率,减少手工测试,这是一种能力,不是测试人员专有。经历过学习和使用的过程,自动化程序开发开头会消耗点时间,有一个基础项目以后都可以在此基础上开发,会节省不少时间。测试人员使用UI自动化不仅节省体力,也更有成就感。