121

I have 6 months of Rails development experience. I've built a web application that's in use now with authentication and authorization and postgresql db.

I'm moving on to my second Rails application but this time, after lessons learnt, I would like to develop it using TDD, since I noticed its a lot easier to scale it and fix bugs. It's slow to develop but in the long run its much easier to deal with.

I have heard of Rspec and Cucumber but am thoroughly confused by them.

I would like to know what the difference is between RSpec and Cucumber and what they are used for.

It would also be useful to know if, from the perspective of a beginner (who is also the sole developer) whether a testing framework is really needed.

4

1 回答 1

341

RSpec 和 Cucumber 都是测试框架。RSpec 包括传统的单元测试(这意味着测试一个类或应用程序的一部分与应用程序的其余部分隔离。所以你的模型做你的模型应该做的事情,控制器做它应该做的事情,等等)。

RSpec 和 Cucumber 都用于验收测试(称为 ATDD、BDD、Specification by Example 等,具体取决于您询问的对象)。这些是业务案例驱动的集成测试,这意味着它们模拟用户使用应用程序的方式并使用完整的 Rails 堆栈,因此可以通过单元测试不会发现应用程序不同部分协同工作方式的问题寻找。

RSpec 和 Cucumber 之间的主要区别在于业务可读性因素。Cucumber 的主要吸引力在于规范(功能)与测试代码是分开的,因此您的产品所有者可以提供或审查规范,而无需深入研究代码。这些是您在 Cucumber 中制作的 .feature 文件。RSpec 具有类似的机制,但是您使用包含业务规范的 Describe、Context 或 It 块来描述步骤,然后立即拥有执行该语句的代码。这种方法对开发人员来说更容易使用,但对非技术人员来说更难一些。

使用哪个?如果您是唯一的开发人员和产品所有者,那么我会坚持使用 RSpec,我觉得它对技术人员来说更容易理解,在保持范围和控制方面提供了一些优势,并且让您避免使用 RegEx 进行测试脚步。如果您正在为客户构建它,并且他们在规范方面亲自动手,请使用 Cucumber 进行验收测试并使用 RSpec 进行单元测试。

只是为了证明两者之间的主要区别:

黄瓜:

#articles.feature
Given an article exists called "Testing Demonstration"
When I visit the list of articles
Then I should see an article called "Testing Demonstration"

#article_steps.rb
Given /^an article exists called "(.+)"$/ do |title|
  FactoryGirl.create(:article, title: title)
end 
When /^I visit the list of articles$/ do
  visit articles_path
end
Then /^I should see an article called "(.+)"$/ do |title|
  page.should have_content title
end

规格

describe "Articles" do
  let(:article) { FactoryGirl.create(:article) }
  context "Index Page" do
    before { visit articles_path }
    it { page.should have_content article.title }
  end
end

这个博客系列非常适合使用 RSpec。

于 2012-08-01T15:37:35.010 回答