在 Rails 项目中使用 Cucumber 进行验收测试

(注:文中用到的项目源码位于 github

在某些情况下,Cucumber 非常适合用来做验收测试。

1. 在 Rails 项目中配置 Cucumber

Gemfile 中的 test 区域添加:

group :test do
  gem 'cucumber-rails', :require => false
end

然后执行 bundle install

接下来执行 rails generate cucumber:install (可以先在后面加 --help 查看可用的选项)。

2. 一个简单的测试

创建 features/view_posts.feature,内容如下:

# language: zh-CN

@view_posts
功能: 查看文章列表
  为了得到文章信息
  我
  可以查看文章列表

  背景:
    假如一共有3篇已发布的文章和1篇未发布的文章

  场景: 文章列表
    当我访问首页
    那么我应该看到3篇已发布的文章
    而且我应该看不到那篇未发布的文章

如上所示,用 Cucumber 编写的验收测试代码非常的文档化,所以一般的业务人员也可以看的懂甚至参与编写。

接下来运行 cucumber,提示我们需要定义一些 steps。将这些 steps 复制并粘贴到新创建的 features/step_definitions/view_posts.rb文件中,并进行修改:

# encoding: utf-8

假如 /^一共有(\d+)篇已发布的文章和(\d+)篇未发布的文章$/ do |total_published, total_unpublished|
  @published_posts = FactoryGirl.create_list(:post, total_published.to_i, published: true)
  @unpublished_posts = FactoryGirl.create_list(:post, total_unpublished.to_i, published: false)
end

当 /^我访问首页$/ do
  visit root_path
end

那么 /^我应该看到(\d+)篇已发布的文章$/ do |total|
  @published_posts.each do |post|
    page.should have_content(post.title)
  end
end

那么 /^我应该看不到那篇未发布的文章$/ do
  @unpublished_posts.each do |post|
    page.should have_no_content(post.title)
  end
end

再次运行 cucumber、修改 feature 或 steps 直至测试通过:

# language: zh-CN
@view_posts
功能: 查看文章列表
  为了得到文章信息
  我
  可以查看文章列表

  背景:                      # features/view_posts.feature:9
    假如一共有3篇已发布的文章和1篇未发布的文章 # features/step_definitions/view_posts.rb:3

  场景: 文章列表                 # features/view_posts.feature:12
    当我访问首页                 # features/step_definitions/view_posts.rb:8
    那么我应该看到3篇已发布的文章        # features/step_definitions/view_posts.rb:12
    而且我应该看不到那篇未发布的文章       # features/step_definitions/view_posts.rb:18

1 scenario (1 passed)
4 steps (4 passed)
0m1.412s