使用 cucumber 编写用户故事

cucumber 是一款 BDD 的工具,通常用于集成测试。
如果应用是一个只提供 API 给手机端调用的后端程序。本来并不是很适合使用 cucumber。
不过随着开发的深入,我越来越觉得单纯的 API 测试(controller 层)无法表达用户的意图。
而目在开发团队对产品的用例也不是非常清楚,没有文档可言的情况下,使用 cucumber 来编写用例也是一个不错的选择。

使用 cucumber 的好处

在开发应用时,我们会把大的功能点分解成小的功能。但是在理解业务逻辑时,我们要从更宏观的角度看待系统。
Rails 框架的单体风格并不足以让人非常舒服的熟悉一个系统。因为 ActiveRecord 的特性,我们只能看到模型之间的关系,而看不到用户是是如何和它们交互的。
这就像给你一堆齿轮,转轴和马达一样,你知道如何拼装它们,但你看不到它们所组成的到底是汽车,飞机还是轮船。
通过用户故事,无论是开发人员还是业务人员都能对系统有一个快速直观的理解。
而 cucumber 就是将用户故事代码化的一款工具。

Get Started

如果使用 rails 自带的 minitest 测试框架。添加 cucumber 的步骤如下。

  1. 在 Gemfile 中添加

    group :test, :development do
      gem 'cucumber-rails', :require => false
      gem 'database_cleaner'
    end
    
  2. 安装

    bundle install
    rails generate cucumber:install
    
  3. 编写第一个 feature

    @require_login
    Feature: XiaomiSports
      In order to know about my xiaomi sports
      As a care user with xiaomi profile binding
      I want list of my xiaomi sports
    
    Scenario: List of the xiaomi sports
      Given the system knows my xiaomi profile
      And the system knows about the following sports::
        |  record_on |  step |
        | 2015-05-25 |  8000 |
        | 2015-05-26 | 10000 |
        | 2015-05-27 | 12000 |
      When the client requests GET "/api/v1/xiaomi_profile/exercise_data?fromDate=2015-05-25&toDate=2015-05-27"
      Then response should be "200"
      And the JSON response should be an array with 3 "step" elements
    
  4. 执行 bin/rake cucumber 并且实现相应步骤
    cucumber 会自动输出实现步骤的提示代码类似于:

You can implement step definitions for undefined steps with these snippets:
Given(/^the system knows about the processions of my corp$/) do
     pending # express the regexp above with the code you wish you had
end

只要把上述代码拷贝到 features/step_definitions/xxxx_steps.rb中, 然后填写测试代码, 那么执行到这段"情节"时, 代码块中的代码就会被执行.

tips

一些实用小技巧

使用 tag 来实现 AOP 的效果

我在上面的代码中使用了 @require_login 这个 tag, 表示下面的步骤是需要在用户登录状态下才能完成的.

可以对 tag 添加钩子函数来 DRY,features/support/hooks.rb

Before('@require_login') do
  # login logic
end

table 的使用

在 cucumber 中使用 table 可以非常直观的表达一组数据结构, 比如上面提到的:

|  record_on |  step |
| 2015-05-25 |  8000 |
| 2015-05-26 | 10000 |
| 2015-05-27 | 12000 |

在 step 中可以这样获取:

Given(/^the system knows about the following sports::$/) do |table|
    table.hashes #=> [{"record_on"=>"2015-05-25", "step"=>"8000"}, {"record_on"=>"2015-05-26", "step"=>"10000"}, {"record_on"=>"2015-05-27", "step"=>"12000"}]
end

request header 的设置方式

直接上代码, 模拟客户端的请求

  @current_user = FactoryGirl.create(:access_token).user
  header 'Accept', 'application/json'
  header 'Content-Type', 'application/json'
  header 'Token', @current_user.access_tokens.last.token

参考文档

https://cucumber.io/docs/reference/rails
http://anthonyeden.com/2013/07/10/testing-rest-apis-with-cucumber-and-rack.html
http://www.emilsoman.com/blog/2013/05/18/building-a-tested/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,444评论 0 23
  • 柏邦妮是我欣赏的奇葩辩手,也是一枚可爱的女编剧。几个月前,她在微博里分享了一本书,来自美国作家伊莱恩·阿伦《天生敏...
    了了君阅读 2,648评论 98 121
  • 网站 http://www.qplot.cn:3838/apps/007-16S_OTUtax/ 这是一个整合多个...
    quan575阅读 2,941评论 8 2
  • --------得不到那个人,每天还会想他,睁开眼睛,闭上眼睛,发呆,瞎想都是他,怎么办? ---------就这...
    蓝湛的湛阅读 145评论 0 0
  • 其实自己也不知道想要说什么,可又有些感触想记录,所以就在此刻写下了这篇碎碎念。 自己的兴趣一直都是舞蹈和摄影...
    jussica阅读 206评论 0 0