Use the Regular Expression Matcher (re)¶
This step matcher allows to use regular expressions in step definition.
The named parameter syntax (?P<name>...)
should be used to extract
parameters from the step definition.
See also
Regular Expressions for more information on regular expressions.
Simple Parameters¶
Provide the Step Definitions¶
# file:step_matcher.features/steps/step_re_matcher_simple_param.py
# -----------------------------------------------------------------------------
# STEPS: With "re" matcher
# -----------------------------------------------------------------------------
from behave import use_step_matcher, when
use_step_matcher("re")
# -- SIMPLE GROUP: foo
@when(u'I try to match "(?P<foo>foo)"')
def step_when_I_try_to_match_foo(context, foo):
context.foo = foo
# -- SIMPLE GROUP: bar
@when(u'I try to match "(?P<bar>bar)"')
def step_when_I_try_to_match_bar(context, bar):
context.bar = bar
# -- SIMPLE GROUP: anything else
@when(u'I try to match "(?P<anything>.*)"')
def step_when_I_try_to_match_anything_else(context, anything):
context.anything = anything
# file:step_matcher.features/steps/step_parse_matcher.py
# -----------------------------------------------------------------------------
# MORE STEPS: With "parse" matcher
# -----------------------------------------------------------------------------
use_step_matcher("parse")
@given(u'I use the regular expression step matcher')
def step_given_I_use_regex_matcher(context):
pass
@then(u'the parameter "{name}" is "{expected_value}"')
def step_then_parameter_is_equal_to(context, name, expected_value):
actual_value = getattr(context, name, None)
assert_that(actual_value, equal_to(expected_value))
@then(u'the parameter "{name}" is none')
def step_then_parameter_is_none(context, name):
actual_value = getattr(context, name, None)
assert_that(actual_value, is_(none()))
Run the Test¶
Now we run this example with behave
:
$ behave --no-source ../step_matcher.features/re_matcher.simple_param.feature Feature: Use "re" Step Matcher with Simple Parameters Scenario: Match simple parameter Given I use the regular expression step matcher When I try to match "foo" Then the parameter "foo" is "foo" And the parameter "bar" is none Scenario: Match two simple parameters Given I use the regular expression step matcher When I try to match "foo" And I try to match "bar" Then the parameter "foo" is "foo" And the parameter "bar" is "bar" 1 feature passed, 0 failed, 0 skipped 2 scenarios passed, 0 failed, 0 skipped 9 steps passed, 0 failed, 0 skipped, 0 undefined Took 0m0.003s
Optional Parameters¶
Provide the Step Definitions¶
# file:step_matcher.features/steps/step_re_matcher_optional_param.py
# -----------------------------------------------------------------------------
# STEPS: With "re" matcher
# -----------------------------------------------------------------------------
from behave import use_step_matcher, when
use_step_matcher("re")
# -- OPTIONAL 1: Optional param is captured and provided as parameter "an_".
@when(u'I try to match (?P<an_>an )?optional "(?P<foo>foo)"')
def step_when_I_try_to_match_an_optional_foo(context, an_, foo):
context.foo = foo
context.an_ = an_
# -- OPTIONAL 2: Optional param is matched, but not captured.
@when(u'I try to match (?:an )?optional "(?P<bar>bar)"')
def step_when_I_try_to_match_an_optional_bar(context, bar):
context.bar = bar
Run the Test¶
Now we run this example with behave
:
$ behave --no-source ../step_matcher.features/re_matcher.optional_param.feature Feature: Use "re" Step Matcher with Optional Parameters Scenario: Optional parameter 1 is missing Given I use the regular expression step matcher When I try to match optional "foo" Then the parameter "foo" is "foo" And the parameter "an_" is none Scenario: Optional parameter 1 is provided Given I use the regular expression step matcher When I try to match an optional "foo" Then the parameter "foo" is "foo" And the parameter "an_" is "an " Scenario: Optional parameter 2 is missing Given I use the regular expression step matcher When I try to match optional "bar" Then the parameter "bar" is "bar" Scenario: Optional parameter 2 is provided (not captured) Given I use the regular expression step matcher When I try to match an optional "bar" Then the parameter "bar" is "bar" 1 feature passed, 0 failed, 0 skipped 4 scenarios passed, 0 failed, 0 skipped 14 steps passed, 0 failed, 0 skipped, 0 undefined Took 0m0.004s
Nested Parameters¶
Provide the Step Definitions¶
# file:step_matcher.features/steps/step_re_matcher_nested_param.py
# -----------------------------------------------------------------------------
# STEPS: With "re" matcher
# -----------------------------------------------------------------------------
from behave import use_step_matcher, when
use_step_matcher("re")
# -- NESTED GROUP:
@when(u'I try to match nested "(?P<foo>foo(?P<bar>bar)?)"')
def step_when_I_try_to_match_nested_foobar(context, foo, bar):
context.foo = foo
context.bar = bar
# -- SIMPLE GROUP: anything else
@when(u'I try to match nested "(?P<anything>.*)"')
def step_when_I_try_to_match_anything_else(context, anything):
context.anything = anything
Run the Test¶
Now we run this example with behave
:
$ behave ../step_matcher.features/re_matcher.nested_param.feature Feature: Use "re" Step Matcher with Nested Parameters # ../step_matcher.features/re_matcher.nested_param.feature:1 Scenario: Nested parameter with nested match # ../step_matcher.features/re_matcher.nested_param.feature:3 Given I use the regular expression step matcher # ../step_matcher.features/steps/step_parse_matcher.py:12 When I try to match nested "foobar" # ../step_matcher.features/steps/step_re_matcher_nested_param.py:14 Then the parameter "foo" is "foobar" # ../step_matcher.features/steps/step_parse_matcher.py:16 And the parameter "bar" is "bar" # ../step_matcher.features/steps/step_parse_matcher.py:16 And the parameter "anything" is none # ../step_matcher.features/steps/step_parse_matcher.py:21 Scenario: Nested parameter with nested anything-else match # ../step_matcher.features/re_matcher.nested_param.feature:10 Given I use the regular expression step matcher # ../step_matcher.features/steps/step_parse_matcher.py:12 When I try to match nested "foo bar" # ../step_matcher.features/steps/step_re_matcher_nested_param.py:20 Then the parameter "foo" is none # ../step_matcher.features/steps/step_parse_matcher.py:21 And the parameter "bar" is none # ../step_matcher.features/steps/step_parse_matcher.py:21 And the parameter "anything" is "foo bar" # ../step_matcher.features/steps/step_parse_matcher.py:16 1 feature passed, 0 failed, 0 skipped 2 scenarios passed, 0 failed, 0 skipped 10 steps passed, 0 failed, 0 skipped, 0 undefined Took 0m0.003s