-
Notifications
You must be signed in to change notification settings - Fork 0
Cucumber Backgrounder
This discussion deals principally with the initial set up and use of cucumber features in a Ruby on Rails (RoR) Project. Discussion of Behaviour Driven (BDD), Test Driven (TDD), and Panic Driven Development (SNAFU) can be found elsewhere. Details regarding installing the Cucumber gem and its recommended support tools for RoR are found at Ruby on Rails.
Given that you have installed the gem called "Cucumber" And you have generated a RoR project called "MyProject" And your session's working directory is called "MyProject" When you run "script/generate cucumber" Then you will create a sub-directory called "features"
The forgoing is written in the style of the feature statements that make up the user interface to cucumber testing. We will return to that topic later. For the moment we deal with the logical arrangement of cucumber files within the context of a RoR project.
An archetypal RoR project directory tree looks like this:
MyProject
|-- README
|-- Rakefile
|-- app
|-- config
|-- db
|-- doc
|-- lib
|-- log
|-- public
|-- script
|-- test
|-- tmp
`-- vendor
Running script/generate cucumber adds this layout to the existing structure:
|-- features
| |-- step_definitions
| | `-- webrat_steps.rb
| `-- support
| `-- env.rb
We are now ready to begin testing with cucumber.
Cucumber divides testing into two parts, the outward facing features and the inward facing steps. As discussed elsewhere, features are descriptions of desired behaviour under predefined conditions and following upon specific events. They are typically used in conjunction with end-user input, and in some cases, may be entirely under end-user (in the form of a domain expert) control. Feature files are given the extension .feature.
Steps, on the other hand, are ruby (.rb) files that contain matchers, snippets of text from the feature files, and blocks of ruby and rails code together with assertions from whatever test system you have installed. Given that cucumber evolved out of RSpec stories it is assumed in the cucumber generator that rspec is available, as is evidenced in the default contents of features/support/env.rb:
# Sets up the Rails environment for Cucumber
ENV["RAILS_ENV"] = "test"
require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
require 'cucumber/rails/world'
Cucumber::Rails.use_transactional_fixtures
# Comment out the next line if you're not using
# RSpec's matchers (should / should_not) in your steps.
require 'cucumber/rails/rspec'
You are not limited to this however. If you choose to use Rails built-in TestUnit, or any other testing suite, then you may do that by extending the cucumber working environment as explained in Using Test::Unit.
The default layout of the features directory is fairly flat. However, cucumber is programmed with the flexibility to support a much more expressive directory structure. For instance:
|-- features
| |-- entities
| | |-- entity.feature
| | `-- step_definitions
| | |-- anything.rb
| | `-- entity_steps.rb
| |-- locations
| | |-- location.feature
| | `-- step_definitions
| | `-- location_steps.rb
| |-- sites
| | `-- step_definitions
| |-- step_definitions
| | `-- webrat_steps.rb
| `-- support
| `-- env.rb
In this case the bland initial setup has been divided into sub-directories informed by model-centric testing. However this could equally well have been broken up in to model/controller/view hierarchies:
|-- features
| |-- models
| | |-- entities
| | | |-- entity.feature
| | | `-- step_definitions
| | | |-- anything.rb
| | | `-- entity_steps.rb
| |-- views
| | | |-- entity_new
| | | `-- step_definitions
| | | `-- entity_new_steps.rb
| |-- step_definitions
| | `-- webrat_steps.rb
| `-- support
| `-- env.rb
It is well to be aware that, regardless of the directory structure chosen, cucumber effectively flattens the test directory when running tests. By this I mean that anything ending in .rb under the start point for a cucumber feature run is searched for feature matches. So that a step contained in features/models/entities/step_definitions/anything.rb can be used in a feature file contained in features/views/entity_new. It is also worth noting that step files can be called anything so long as they end in .rb