由 step definition 失控引发的讨论和思考

引子

公司在新项目上 BDD 的开发模式,迄今已经差不多 2 个月了。
按最初的分工,开发写 rspec, 测试写 cucumber,双线并行。
加上最新配置好的 jenkins ci 环境,整个开发流程走的很顺,
代码质量也得到了很好的控制。

今天按老样子写某个 component 的新加的feature的场景,
写 step definition 的时候,发现 stepdef.rb 文件已经
300 多行了。 瞬间有种再不控制就爆炸的感觉。

于是就把问题抛了出去:

cucumber 的 step definition 爆了。。。 越写越多,真难控制!

讨论

我将问题抛在了 TestCirle 的群里,讨论地断断续续从下午一点到下午六点。我将每个人的发言总结下。

MIC-Seeyon

step_definition 之上抽象一些 common function,再之上是 page object 的应用。
这样基本就封装了大部分逻辑了。这样就算 step_definition 再有多,也不会有多少代码吧~

如果有页面很多 ajax 操作,你可以把 ajax 的基础页写成 basePage,
然后其他的 ajax 业务写成不同的 page,继承 basePage 即可~

如果觉得实现太重的话,可以分工程,通用的抽取出来,其他的不同模块或者业务,基于这部分 common 的,搞自己的 feature,自己实现~
这样对具体的编码的人来说就轻了~

把握好 feature 的度, 整理一下测试用例的执行场景哦~

step definition 里面有太多冗余的东西的话就会很重,需要去冗。
如果有的话,那也得做一层基本的网页操作的抽象~
我是说业务和交互级别的 actions
比如根据 label 操作 input
各种条目的选择,操作,内容获取
这些可能都跟你产品的前段设计有关哦~

我们是这么做的:

  1. webdriver 的 api 操作封装一层
  2. 然后产品使用的前段控件封装一层
  3. 然后业务级别的逻辑跟操作封装一层
  4. 然后常用的操作组合封装一个层
  5. 最后才是 step definition

cucumber就是一个驱动自动化测试的粘合剂

横刀天笑

逻辑肯定是在 page object 里的, page object 应该暴露业务接口,既然暴露业务接口,那肯定是包含业务逻辑的
比如我们酒店首页 HotelHomePage。有个搜索功能,那 肯定提供一个 search 的方法,search 里接受一个查询条件

page object,应该从用户角度来看,你这个页面提供了哪些功能,从业务功能上来看 po,而不是从操作上, 然后 step defs 里是流程的描述

持续交付里有一章讲自动化测试, 里面讲了一个三层:

  1. 测试描述层(case)
  2. 测试实现层,或者叫流程层
  3. 应用接口层(比如使用 selenium 或 httpclient 之类的和应用程序打交道)

插曲 -_-!

如何做一个能害死人的自动化测试工具
http://www.ltesting.net/ceshi/ceshijishu/zdcs/2013/0806/206547.html?1375845711

思考

我回想了下,这个项目一开始没采用 page object, 因为:

  1. 以为项目不复杂,参考另一个公司 rails 项目的 cucumber features。
  2. 使用了 pickle,导致 feature 撰写的时候, 有过多的 code 色彩,如果使用 page object 的话 就有点混搭的感觉,不伦不类了。
  3. 最早之前用 page object 有些厌倦了。 特别 ajax render 的页面,导致继承 base 的页面过多。

关于第一点:

接触过很多 rails 的项目, 往往是将 cucumber features 作为 High level 的 acceptance test, 挑选的场景的粒度都是比较粗。
而且 rails 项目的 cucumber 基本都是开发来写的,我一开始就把自己定位为开发。

关于第二点:

pickle 非常强大

Pickle gives you cucumber steps that create your models easily from
factory-girl, machinist, or fabrication. You can also just use ActiveRecord as a factory but it’s not as cool.

但是使用 pickle 的前提是你必须了解 model, 了解各种 model 的 factory, 也就是其实你已经
是从开发的角度来考虑如何测试代码了。 你在 steps 里面的数据设计,其实都是你知道的结果,并不是测试出来的。

pickle 的使用,使 Given, WhenAnd 对 测试和 stakeholder 不太友好。 这不像 page object 的风格。

关于第三点

我在前面一个项目中应用了 Page Object, 我在博客里也粗略地介绍过, 参考 webdriver
由于我们项目大量使用 ajax, 导致基于 basePage 的子页面各种各样的特别多。个人感觉也不太舒服。

综上,所以一开始就忽略了 page object。

目前

我们现在仅仅把 features 进行了分类(利用目录结构),将所有的 step definition 都放在了一个 rb 文件里。随着以后的不同的场景,失控也是时间问题。

结论

目前看来, 这个项目的 cucumber 想要完成的是 整个 UI 的自动化测试。 要去冗,去重需要做的是:

  1. 合并和参数化
  2. Page Object
文章目录
  1. 1. 引子
  2. 2. 讨论
  3. 3. 思考
    1. 3.1. 关于第一点:
    2. 3.2. 关于第二点:
    3. 3.3. 关于第三点
    4. 3.4. 目前
  4. 4. 结论
|