Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

spinach vs cucumber for BDD in rails

I am starting on BDD. Was wondering which would be better to start with Cucumber or Spinach. My impression is that Spinach is new off the block. Look here

Which one should I start with. The criteria would be -

  1. Support across the board.
  2. Flexibility of use
  3. Third party tool and APIs integration.

Again it might be ignorant question of the newbie: Where does capybara fit into the picture.

like image 272
Sam Wilder Avatar asked Nov 03 '11 06:11

Sam Wilder


3 Answers

For some context, I've been a long time user of Cucumber, but always wished it was Spinach since day one. I'm switching all my projects to Spinach despite its shortcomings because it uses the new, hot-off-the-block PORO technique (Plain Old Ruby Objects ;). Now I can expand my steps however I want, because it's just Ruby.

To answer your question, as of this writing:

  1. Support across the board.

Cucumber

Spinach is still developing some features, including 'Background' blocks, and I'm currently trying to get it to recognize tables.

  1. Flexibility of use

Spinach

Cucumber encourages bad step design from the start, IMO. If you create feature-specific steps, you'll trip over them later, and if you create reusable global steps, your feature definitions will be long, generic, and boring to read. I've heard people claim they can walk a balance successfully and be just specific enough but still have reusable steps; I consider myself well versed enough that if I can't do it reliably, it's too hard.

  1. Third party tool and APIs integration

Cucumber, assuming the bullet point could be interpreted as community.

If it's really "third party tools and API integration" you're after, Spinach supports capybara and rspec, which is most of what you're after. Cucumber has 3rd party reusable step libraries, but as noted in my earlier point, I think this is bad. In regard to 3rd party & integrations, even if it's not there yet, your really can't get any better than plain old ruby objects.

Where does capybara fit into the picture

Capybara is your test interface to your site, aka a testing mouse & keyboard. You could start it up in a console and drive your app, but that'd get repetitive. Cucumber/Spinach (or rspec/test-unit/minitest) all could use capybara to automate testing your app. People prefer Cucumber/Spinach because they help you step out of the code for a bit to think like a user.


Overall, you'd probably be best off getting an rspec/cucumber book and doing what it says. Just be aware that testing takes a while to get good at, so don't stop there. Maybe check out Spinach somewhere in the process; if you like Cucumber, you might find you'll really like Spinach.

like image 148
Woahdae Avatar answered Oct 21 '22 05:10

Woahdae


DISCLAIMER: I'm a Spinach mantainer.

If you're starting with BDD I'd highly recommend two books:

  • The RSpec book
  • The Cucumber book

I think it's important to learn all the BDD and TDD process (outside-in etc..) and then choose the tool you feel more comfortable with.

Having said that, Cucumber has a huge community, but a lot of things are also aplicable to Spinach, since what they have in common is Gherkin.

As for flexibility of use I would say both are really flexible, but I (obviously) prefer Spinach as every feature it's just a Ruby class, where you can include modules, inherit from other classes and so on (this also applies to APIs integration).

I you want, you can take a look at the spinach-rails-demo and see how everything works.

like image 24
Oriol Gual Avatar answered Oct 21 '22 05:10

Oriol Gual


If you're stuck with Cucumber and you don't want global steps, you can work around the problem by tagging the steps with some sort of scenario ID:

# features/1_greetings.feature
Scenario: Formal greeting
  Given I have an empty array [#1]
  And I append my first name and my last name to it [#1]
  When I pass it to my super-duper method [#1]
  Then the output should contain a formal greeting [#1]

The #1 scenario id can be any value. I like to use ticket numbers for future reference.

You can then place all the steps in one step definition file. It's close enough to the look of Spinach::FeatureSteps. No regex arguments too!

# features/step_definitions/1_greetings.rb
Given 'I have an empty array [#1]' do
  #...
end

And 'I append my first name and my last name to it [#1]' do
  #...
end

When 'I pass it to my super-duper method [#1]' do
  #...
end

Then 'the output should contain a formal greeting [#1]' do
  #...
end

I posted more about the workaround at github.

like image 2
gsmendoza Avatar answered Oct 21 '22 04:10

gsmendoza