Passing parameter in "Examples:" table of "Scenario Outline:" in a feature file

paul picture paul · Jan 22, 2015 · Viewed 8.1k times · Source

Here as you can see I am trying fetch a value from .yml file located in config/environments in Examples: table.

But instead of fetching it is sending the value as it is?

Is it possible to pass parameter like this? If Yes, how?

If not, which Ruby or Cucumber feature/concept refrains user to do so and why?

Feature: Verify login of all test users
I want to verify all test users can login.
  Scenario Outline: Login as different users on the website
    Given I am on login page
    When I enter "<username>" and password
    Then I click Login button
    And I see "<user>" successfully logged in
    Examples:
    |user|username|
    |testuser1|#{FigNewton.test1_email}|
    |testuser2|FigNewton.test2_email|

Answer

diabolist picture diabolist · Jan 23, 2015

First of all this is a pretty poor feature, better would be

Scenario: Test Users can login
   Given there are some test users
   When the test users login
   Then all test users should be logged in

or something like that. Features are for stating what you want to do and why, not how you do things.

IF you do the above then all the programming will be done in the step definitions. This will allow you do do whatever you want.

You can implement this quite easily e.g

Given 'there are some test users' do
  @test_users = create_test_users
end

When 'the test users login' do
  @login_results = login_each(@test_users)
end

Then 'all test users should be logged in' do
  expect(check_for_errors(@login_results).count).to eql 0
end

then implement the methods you need in a step helper e.g

module TestUsersLoginStepHelper
  def create_test_users
    ...

  def login_each(users)
    users.each do 
      ...
  ...
end
World TestUsersLoginStepHelper

By putting all the work in the step definitions, you make your live much easier, as you can use the full power of ruby to do what you need