tags:

views:

15

answers:

1

I'm using cucumber with webrat/mechanize to test a PHP site and I'm trying to improve the speed the tests run by avoiding running unnecessary steps.

I want to use a scenario outline to check a whole lot of pages are accessible/protected depending on the user who is logged in:

Scenario Outline: Check page access is secure
  Given I am logged in as "<user>"
    And I am on <page>
  Then I should see "<message>"
Examples:
  |user  |page      |message                |
  |admin |home page |Welcome to my site     |
  |admin |admin page|Site administration    |
  |editor|home page |Welcome to my site     |
  |editor|admin page|Access denied          |
  |guest |home page |Please login           |
  |guest |admin page|Access denied          |
  ...

This works, but given I have 10 roles and hundreds of pages to check, there is a lot of overhead in running the login step every time the outline runs.

I'm wondering if there is a way to run the login step once for each role, then visit each page in turn without needing to login every time. i.e run "login, visit 1, visit 2, visit 3" instead of "login, visit 1, login, visit 2, login, visit 3".

I've tried using hooks, and Background, but can't seem to find an approach that works. Is this possible?

A: 

You could implement the Given step to only log in once for each role:

# lazily log in each role as needed, and keep the login in a hash table
$logins = Hash.new do |_logins, role|
  _logins[role] = do_expensive_login(role)
end
Given /^I am logged in as "([^"]+)"$/ |role|
  @login = $logins[role]
end

Of course, if the future steps can change the state of the login, or change the world such that the login is no longer valid, this might hose you down the line, so tread carefully.

rampion
That seems like a good approach if the site I was testing was written in Ruby, but I'm testing a PHP site and I'm not sure how to save the login state.
simoncoggins