Capybara is a tool that interacts with a website the way a human would (like visiting a url, clicking a link, typing text into a form and submitting it). It is used to emulate a user's flow through a website. With Capybara you can write something like this:

describe "the signup process", :type => :feature do
  before :each do
    User.make(:email => '[email protected]', :password => 'caplin')
  end

  it "signs me in" do
    visit '/sessions/new'
    within("#session") do
      fill_in 'Login', :with => '[email protected]'
      fill_in 'Password', :with => 'password'
    end
    click_link 'Sign in'
    page.should have_content 'Success'
  end
end

Cucumber is a tool to write human-readable tests that are mapped into code. With it, you can rewrite the above example like this:

Scenario: Signup process

Given a user exists with email "[email protected]" and password "caplin"
When I try to login with "[email protected]" and "caplin"
Then I should be logged in successfully

The almost plain-text interpretation is useful to pass around non-developers but also need some code mapped into it to actually work (the step definitions).

Usually you will use Capybara if you're testing a website and use Cucumber if you need to share those tests with non-developers. These two conditions are independent so you can use one without the other or both or none.

PS: in the code snippet there is some RSpec as well. This is needed because Cucumber or Capybara by themselves cannot test something. They rely on RSpec, Test::Unit or minitest to do the actual "Pass or Fail" work.


cucumber is a BDD tool that expresses testing scenarios in a business-readable, domain-specific language.

capybara is an automated testing tool (often used) for ROR applications.

On the capybara github page, there's an example on using capybara with cucumber.


Cucumber is a general-purpose BDD tool. It knows nothing about web apps. So Cucumber step definitions call Capybara in order to test web apps.