Tutorial 4: Scenario Outline

Goal

Use scenario outline as a parametrized template (avoid too many similar scenarios).

A Scenario Outline provides a parametrized scenario script (or template) for the feature file writer. The Scenario Outline is executed for each example row in the Examples section below the Scenario Outline.

Write the Feature Test

# file:features/tutorial04_scenario_outline.feature
Feature: Scenario Outline (tutorial04)

  Scenario Outline: Use Blender with <thing>
    Given I put "<thing>" in a blender
    When I switch the blender on
    Then it should transform into "<other thing>"

    Examples: Amphibians
        | thing         | other thing |
        | Red Tree Frog | mush        |
        | apples        | apple juice |

    Examples: Consumer Electronics
        | thing         | other thing |
        | iPhone        | toxic waste |
        | Galaxy Nexus  | toxic waste |

Provide the Test Automation

# file:features/steps/step_tutorial03.py
# ----------------------------------------------------------------------------
# STEPS:
# ----------------------------------------------------------------------------
from behave   import given, when, then
from hamcrest import assert_that, equal_to
from blender  import Blender

@given('I put "{thing}" in a blender')
def step_given_put_thing_into_blender(context, thing):
    context.blender = Blender()
    context.blender.add(thing)

@when('I switch the blender on')
def step_when_switch_blender_on(context):
    context.blender.switch_on()

@then('it should transform into "{other_thing}"')
def step_then_should_transform_into(context, other_thing):
    assert_that(context.blender.result, equal_to(other_thing))

Note

Test automation layer reused from Tutorial 3: Step Parameters.

Provide the Domain Model

# file:features/steps/blender.py
# -----------------------------------------------------------------------------
# DOMAIN-MODEL:
# -----------------------------------------------------------------------------
class Blender(object):
    TRANSFORMATION_MAP = {
        "Red Tree Frog": "mush",
        "apples": "apple juice",
        "iPhone": "toxic waste",
        "Galaxy Nexus": "toxic waste",
    }
    def __init__(self):
        self.thing  = None
        self.result = None

    @classmethod
    def select_result_for(cls, thing):
        return cls.TRANSFORMATION_MAP.get(thing, "DIRT")

    def add(self, thing):
        self.thing = thing

    def switch_on(self):
        self.result = self.select_result_for(self.thing)

Note

Domain model reused from Tutorial 3: Step Parameters.

Run the Feature Test

When you run the feature file from above (with plain formatting):

$ behave ../features/tutorial04_scenario_outline.feature
Feature: Scenario Outline (tutorial04)   # ../features/tutorial04_scenario_outline.feature:1

  Scenario Outline: Use Blender with Red Tree Frog -- @1.1 Amphibians  # ../features/tutorial04_scenario_outline.feature:10
    Given I put "Red Tree Frog" in a blender                           # ../features/steps/step_tutorial03.py:39
    When I switch the blender on                                       # ../features/steps/step_tutorial03.py:44
    Then it should transform into "mush"                               # ../features/steps/step_tutorial03.py:48

  Scenario Outline: Use Blender with apples -- @1.2 Amphibians  # ../features/tutorial04_scenario_outline.feature:11
    Given I put "apples" in a blender                           # ../features/steps/step_tutorial03.py:39
    When I switch the blender on                                # ../features/steps/step_tutorial03.py:44
    Then it should transform into "apple juice"                 # ../features/steps/step_tutorial03.py:48

  Scenario Outline: Use Blender with iPhone -- @2.1 Consumer Electronics  # ../features/tutorial04_scenario_outline.feature:15
    Given I put "iPhone" in a blender                                     # ../features/steps/step_tutorial03.py:39
    When I switch the blender on                                          # ../features/steps/step_tutorial03.py:44
    Then it should transform into "toxic waste"                           # ../features/steps/step_tutorial03.py:48

  Scenario Outline: Use Blender with Galaxy Nexus -- @2.2 Consumer Electronics  # ../features/tutorial04_scenario_outline.feature:16
    Given I put "Galaxy Nexus" in a blender                                     # ../features/steps/step_tutorial03.py:39
    When I switch the blender on                                                # ../features/steps/step_tutorial03.py:44
    Then it should transform into "toxic waste"                                 # ../features/steps/step_tutorial03.py:48

1 feature passed, 0 failed, 0 skipped
4 scenarios passed, 0 failed, 0 skipped
12 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m0.001s