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