36
36
ALPHA_REGEX = re .compile (r"^\d+_*" )
37
37
38
38
39
- def find_argumented_step_fixture_name (
40
- name : str , type_ : str , fixturemanager : FixtureManager , request : FixtureRequest | None = None
41
- ) -> str | None :
39
+ def find_argumented_step_fixture_name (name : str , type_ : str , fixturemanager : FixtureManager ) -> str | None :
42
40
"""Find argumented step fixture name."""
43
41
# happens to be that _arg2fixturedefs is changed during the iteration so we use a copy
44
42
for fixturename , fixturedefs in list (fixturemanager ._arg2fixturedefs .items ()):
45
43
for fixturedef in fixturedefs :
46
- parsers = getattr (fixturedef .func , "_pytest_bdd_parsers" , [])
47
- for parser in parsers :
48
- match = parser .is_matching (name )
49
- if not match :
50
- continue
51
-
52
- parser_name = get_step_fixture_name (parser .name , type_ )
53
- if request :
54
- try :
55
- request .getfixturevalue (parser_name )
56
- except FixtureLookupError :
57
- continue
58
- return parser_name
44
+ parser = getattr (fixturedef .func , "_pytest_bdd_parser" , None )
45
+ if parser is None :
46
+ continue
47
+
48
+ match = parser .is_matching (name )
49
+ if not match :
50
+ continue
51
+
52
+ parser_name = get_step_fixture_name (parser .name , type_ )
53
+ return parser_name
59
54
return None
60
55
61
56
62
- def _find_step_function (request : FixtureRequest , step : Step , scenario : Scenario ) -> Any :
57
+ def _find_step_function (request : FixtureRequest , step : Step , scenario : Scenario ) -> Callable [..., Any ] :
63
58
"""Match the step defined by the regular expression pattern.
64
59
65
60
:param request: PyTest request object.
@@ -76,7 +71,7 @@ def _find_step_function(request: FixtureRequest, step: Step, scenario: Scenario)
76
71
except FixtureLookupError as e :
77
72
try :
78
73
# Could not find a fixture with the same name, let's see if there is a parser involved
79
- argumented_name = find_argumented_step_fixture_name (name , step .type , request ._fixturemanager , request )
74
+ argumented_name = find_argumented_step_fixture_name (name , step .type , request ._fixturemanager )
80
75
if argumented_name :
81
76
return request .getfixturevalue (argumented_name )
82
77
raise e
@@ -87,7 +82,9 @@ def _find_step_function(request: FixtureRequest, step: Step, scenario: Scenario)
87
82
) from e2
88
83
89
84
90
- def _execute_step_function (request : FixtureRequest , scenario : Scenario , step : Step , step_func : Callable ) -> None :
85
+ def _execute_step_function (
86
+ request : FixtureRequest , scenario : Scenario , step : Step , step_func : Callable [..., Any ]
87
+ ) -> None :
91
88
"""Execute step function.
92
89
93
90
:param request: PyTest request.
@@ -96,19 +93,16 @@ def _execute_step_function(request: FixtureRequest, scenario: Scenario, step: St
96
93
:param function step_func: Step function.
97
94
:param example: Example table.
98
95
"""
99
- kw = dict ( request = request , feature = scenario .feature , scenario = scenario , step = step , step_func = step_func )
96
+ kw = { " request" : request , " feature" : scenario .feature , " scenario" : scenario , " step" : step , " step_func" : step_func }
100
97
101
98
request .config .hook .pytest_bdd_before_step (** kw )
102
-
103
99
kw ["step_func_args" ] = {}
104
100
try :
105
101
# Get the step argument values.
106
- converters = getattr ( step_func , "converters" , {})
102
+ converters = step_func . _pytest_bdd_converters
107
103
kwargs = {}
108
104
109
- parsers = getattr (step_func , "_pytest_bdd_parsers" , [])
110
-
111
- for parser in parsers :
105
+ for parser in step_func ._pytest_bdd_parsers :
112
106
if not parser .is_matching (step .name ):
113
107
continue
114
108
for arg , value in parser .parse_arguments (step .name ).items ():
@@ -117,11 +111,12 @@ def _execute_step_function(request: FixtureRequest, scenario: Scenario, step: St
117
111
kwargs [arg ] = value
118
112
break
119
113
120
- kwargs = {arg : kwargs [arg ] if arg in kwargs else request .getfixturevalue (arg ) for arg in get_args (step_func )}
114
+ args = get_args (step_func )
115
+ kwargs = {arg : kwargs [arg ] if arg in kwargs else request .getfixturevalue (arg ) for arg in args }
121
116
kw ["step_func_args" ] = kwargs
122
117
123
118
request .config .hook .pytest_bdd_before_step_call (** kw )
124
- target_fixture = getattr ( step_func , "target_fixture" , None )
119
+ target_fixture = step_func . _pytest_bdd_target_fixture
125
120
126
121
# Execute the step as if it was a pytest fixture, so that we can allow "yield" statements in it
127
122
return_value = call_fixture_func (fixturefunc = step_func , request = request , kwargs = kwargs )
0 commit comments