1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
"""Step arguments tests."""
import textwrap
def test_every_steps_takes_param_with_the_same_name(pytester):
pytester.makefile(
".feature",
arguments=textwrap.dedent(
"""\
Feature: Step arguments
Scenario: Every step takes a parameter with the same name
Given I have 1 Euro
When I pay 2 Euro
And I pay 1 Euro
Then I should have 0 Euro
And I should have 999999 Euro
"""
),
)
pytester.makepyfile(
textwrap.dedent(
r"""
import pytest
from pytest_bdd import parsers, given, when, then, scenario
@scenario("arguments.feature", "Every step takes a parameter with the same name")
def test_arguments():
pass
@pytest.fixture
def values():
return [1, 2, 1, 0, 999999]
@given(parsers.re(r"I have (?P<euro>\d+) Euro"), converters=dict(euro=int))
def _(euro, values):
assert euro == values.pop(0)
@when(parsers.re(r"I pay (?P<euro>\d+) Euro"), converters=dict(euro=int))
def _(euro, values, request):
assert euro == values.pop(0)
@then(parsers.re(r"I should have (?P<euro>\d+) Euro"), converters=dict(euro=int))
def _(euro, values):
assert euro == values.pop(0)
"""
)
)
result = pytester.runpytest()
result.assert_outcomes(passed=1)
def test_exact_match(pytester):
"""Test that parsers.re does an exact match (fullmatch) of the whole string.
This tests exists because in the past we only used re.match, which only finds a match at the beginning
of the string, so if there were any more characters not matching at the end, they were ignored"""
pytester.makefile(
".feature",
arguments=textwrap.dedent(
"""\
Feature: Step arguments
Scenario: Every step takes a parameter with the same name
Given I have 2 Euro
# Step that should not be found:
When I pay 1 Euro by mistake
Then I should have 1 Euro left
"""
),
)
pytester.makepyfile(
textwrap.dedent(
r"""
import pytest
from pytest_bdd import parsers, given, when, then, scenarios
scenarios("arguments.feature")
@given(parsers.re(r"I have (?P<amount>\d+) Euro"), converters={"amount": int}, target_fixture="wallet")
def _(amount):
return {"EUR": amount}
# Purposefully using a re that will not match the step "When I pay 1 Euro and 50 cents"
@when(parsers.re(r"I pay (?P<amount>\d+) Euro"), converters={"amount": int})
def _(amount, wallet):
wallet["EUR"] -= amount
@then(parsers.re(r"I should have (?P<amount>\d+) Euro left"), converters={"amount": int})
def _(amount, wallet):
assert wallet["EUR"] == amount
"""
)
)
result = pytester.runpytest()
result.assert_outcomes(failed=1)
result.stdout.fnmatch_lines(
'*StepDefinitionNotFoundError: Step definition is not found: When "I pay 1 Euro by mistake"*'
)
def test_argument_in_when(pytester):
pytester.makefile(
".feature",
arguments=textwrap.dedent(
"""\
Feature: Step arguments
Scenario: Argument in when, step 1
Given I have an argument 1
When I get argument 5
Then My argument should be 5
"""
),
)
pytester.makepyfile(
textwrap.dedent(
r"""
import pytest
from pytest_bdd import parsers, given, when, then, scenario
@pytest.fixture
def arguments():
return dict()
@scenario("arguments.feature", "Argument in when, step 1")
def test_arguments():
pass
@given(parsers.re(r"I have an argument (?P<arg>\d+)"))
def _(arguments, arg):
arguments["arg"] = arg
@when(parsers.re(r"I get argument (?P<arg>\d+)"))
def _(arguments, arg):
arguments["arg"] = arg
@then(parsers.re(r"My argument should be (?P<arg>\d+)"))
def _(arguments, arg):
assert arguments["arg"] == arg
"""
)
)
result = pytester.runpytest()
result.assert_outcomes(passed=1)
|