Costi
Costi

Reputation: 1231

Seed data in cucumber tests

I'm writing a web app which is used a SaS. Each customer has their own db and app directory so I have a rake task which creates all necessary minimum data (seed data) to run their website: default rights and roles, a superadmin user, a "us_states" table already populated, some local depots and terminals (it's a logistics app).

I don't have any cucumber scenarios for it and I just started building some. I'm a beginner with cucumber.

I first put that seed data task in a Given line, but that is pretty much is a given for all scenarios, and it doesn't make much sense to non-programmers who look at the scenarios (for humans, it is such a given that it doesn't need to be expressed consciously) so I moved it into hooks.rb.

My first scenario looks like this:

  1 Feature: Place an order
  2   In order to keep orders in the database
  3   As a admin
  4   I want to place orders
  5
  6 Scenario: Using common legs
  7   Given I have 1 customers
  8   And I'm on the homepage
  9   And I follow "Place an Order"
 10   When I select the customer
 11   And I select the SSLine
 12   And I click "Use Common Legs"
 13   Then I should see "PICKUP AT"
 14   And I should see "DELIVER TO" or "LOAD AT"
 15   And I should see EMPTY RETURN

My hooks.rb looks like this:

1 Before do
2   MinimumData.new('costi', '1234').populate  #username and password
3 end

Questions:

  1. I don't want to run this MinimumData.populate task before each scenario because it takes 8 seconds. Should I make it run just once, globally? How?
  2. Do I have to cleanup the database with an After.do? I really don't want to do that, because I will duplicate the logic in the After.do, only with Model.delete_all statements. I noticed that after my first run, the test db has all that data still in. I can purge it with rake db:test:purge and the reinitialize it. Is that a good practice?

Upvotes: 17

Views: 7893

Answers (3)

Geoff Lanotte
Geoff Lanotte

Reputation: 7500

I don't know of a before(:all) equivalent in cucumber. What you could do is add your seed to a file say features/support/seeds.rb and then at the top of your features/support/env.rb and below the line that requires your environment.rb put the line:

require File.dirname(__FILE__) + '/seeds'

or alternatively

#just write the code you want to execute directly into the env.rb file

These are your available blocks to add in the env.rb

Before do
  #this code is run before each scenario
end

after do
  #this code is run after each scenario
end

at_exit do
  #this code is run at the end
end

Upvotes: 22

Bryan Ash
Bryan Ash

Reputation: 4479

Geoff Lanotte has the answer. I just though I'd add a link to the Cucumber wiki page on hooks that describes these and other examples.

Upvotes: 3

dmonopoly
dmonopoly

Reputation: 3331

One correction to Geoff Lanotte's answer. It should be

Before do
  # this code is run before each scenario
end

with a capital B.

Instead of putting this kind of code in your env.rb file, however, you may want to put it in a new file in your features/support directory, e.g. a "hooks.rb" file. This is because the env.rb file is automatically regenerated if you upgrade cucumber-rails.

More information here: https://github.com/cucumber/cucumber/wiki/Hooks

Upvotes: 7

Related Questions