测试 使用 feature Spec 编写用户 / 验收测试

flypiggys · September 08, 2013 · Last by yfractal replied at September 09, 2013 · 4753 hits

feature spec 与 request spec 的区别 rspec 和 capybara 在 ruby 程序员中很多人都不陌生了。在 2.0 版本以后的 capybara 中,新加入了 feature spec 的写法。在 rspec 中默认使用 spec/feature,而不再使用 spec/request.

feature spec 在测试中来说是比较高等级的测试。大概相当于集成测试或者更高级别的用户/验收测试。一般是模拟用户的实际操作和应用外部的请求来执行测试.简单来说就是模拟浏览器中的动作,期待应用正确的反应。

为什么 2.0 之后的 capybara 要做出这样的改动呢?

因为一般的来说 capybara 是模拟浏览器中的动作,这种测试是相当于模拟一个用户在用户界面中的操作,是基于 usercase 的。而以前的 request spec 则还是没有脱离应用层面 (发送 http 请求,比较相应结果),比如在以前的 capybara 的 dsl 中,使用'get'来访问页面,而现在则改成了'visit'.后者'访问'这个动作,比'get'这个 http 请求更接近于用户的行为。

所以使用 feature spec 相对来说更符合 behavior 的思想,也带来更好的阅读性。

rails 中使用 feature spec 本文以 rails 为例,来介绍 feature spec 的使用。

首先安装 rspec 和 capybara,在 gemfile 中加入

group :development, :test do
   gem 'rspec-rails'
end

group :test do
   gem 'capybara'
end

之后执行

bundle install

再之后执行

rails generate rspec:install

rspec 和 capybara 就安装完毕了。

rails 中的 generator 默认生成的集成测试会在 request/xxxx_spec.rb.默认是不支持 capybara 的,我们如果要在其中使用 capybara 还要在 spec_helper 中的 configure 中加入config.include Capybara::DSL

而我们要使用的 feature/xxxx_spec.rb 目前尚无法由 rails 自动生成,但是不用做任何设置就可以支持 capybara 的 DSL.

所以我们手动建立 spec/feature 文件夹,在其中手动创建 XXXX_spec.rb 的测试文件。

feature spec 写法 在 feature spec 中,我们使用feature - scenario 来替代之前 rspec 的describe - it模式 注意两者千万不要混写成feature - it或者describe - scenario这种不伦不类的风格..

另外与 describe 不同,feature 下面是不允许再套 feature 的。

describe "Static pages" do
  describe "Home page" do
    it "should have the content 'Sample App'" do
      visit '/static_pages/home'
      expect(page).to have_content('Sample App')
    end
  end
end

这样是可以的,但是把 describe 换成 feature 则会报错。

feature spec 的测试中,我们一般按照待测的功能点来划分用例,即每一个 feature.而每一个 scenario 对应一条 user case.这一点和测试人员写测试用例的方法很相似。比如下面的 2 条测试用例

功能点 用户输入 期望结果 用户登录 用户输入正确的用户名和密码 登录成功 用户输入错误的用户名和密码 登录失败

使用 feature spec 的方式写出的测试代码如下。

require "spec_helper"

feature "Login" do
  scenario "User enter right account" do
    visit "/login"

    fill_in "Name", :with => "username"
    fill_in "Password", :with => "right"
    click_button "login"

    expect(page).to have_text("welcome back,username")
  end

  scenario "User enter wrong account" do
    visit "/login"

    fill_in "Name", :with => "username"
    fill_in "Password", :with => "wrong"
    click_button "login"

    expect(page).to have_text("Wrong password,please try again!")
  end

end

feature spec 的简单介绍就写到这里,希望大家喜欢这种方式。

source

feature 之下虽然不能嵌套 feature,但是可以嵌套 context

可不可以说,rspec 自带了黄瓜呢?

You need to Sign in before reply, if you don't have an account, please Sign up first.