|
7 | 7 | from warnings import warn |
8 | 8 |
|
9 | 9 | import pytest |
10 | | -from _pytest.mark import ParameterSet |
| 10 | + |
11 | 11 |
|
12 | 12 | # Create a symbol that will work to create a fixture containing 'yield', whatever the pytest version |
13 | 13 | # Note: if more prevision is needed, use if LooseVersion(pytest.__version__) < LooseVersion('3.0.0') |
@@ -79,9 +79,17 @@ def get_pytest_parametrize_marks(f): |
79 | 79 | mark_info = getattr(f, 'parametrize', None) |
80 | 80 | if mark_info is not None: |
81 | 81 | # mark_info.args contains a list of (name, values) |
82 | | - return tuple(_ParametrizationMark(_LegacyMark(mark_info.args[2*i], mark_info.args[2*i + 1], |
83 | | - **mark_info.kwargs)) |
84 | | - for i in range(len(mark_info.args) // 2)) |
| 82 | + if len(mark_info.args) % 2 != 0: |
| 83 | + raise ValueError("internal pytest compatibility error - please report") |
| 84 | + nb_parameters = len(mark_info.args) // 2 |
| 85 | + if nb_parameters > 1 and len(mark_info.kwargs) > 0: |
| 86 | + raise ValueError("Unfortunately with this old pytest version it is not possible to have several " |
| 87 | + "parametrization decorators") |
| 88 | + res = [] |
| 89 | + for i in range(nb_parameters): |
| 90 | + param_name, param_values = mark_info.args[2*i:2*(i+1)] |
| 91 | + res.append(_ParametrizationMark(_LegacyMark(param_name, param_values, **mark_info.kwargs))) |
| 92 | + return tuple(res) |
85 | 93 | else: |
86 | 94 | return () |
87 | 95 |
|
@@ -126,16 +134,28 @@ def get_test_ids_from_param_values(param_names, |
126 | 134 |
|
127 | 135 |
|
128 | 136 | # ---- ParameterSet api --- |
129 | | -def is_marked_parameter_value(v): |
130 | | - return isinstance(v, ParameterSet) |
| 137 | +try: # pytest 3.x+ |
| 138 | + from _pytest.mark import ParameterSet |
| 139 | + def is_marked_parameter_value(v): |
| 140 | + return isinstance(v, ParameterSet) |
| 141 | + |
| 142 | + def get_marked_parameter_marks(v): |
| 143 | + return v.marks |
| 144 | + |
| 145 | + def get_marked_parameter_values(v): |
| 146 | + return v.values |
131 | 147 |
|
| 148 | +except ImportError: # pytest 2.x |
| 149 | + from _pytest.mark import MarkDecorator |
132 | 150 |
|
133 | | -def get_marked_parameter_marks(v): |
134 | | - return v.marks |
| 151 | + def is_marked_parameter_value(v): |
| 152 | + return isinstance(v, MarkDecorator) |
135 | 153 |
|
| 154 | + def get_marked_parameter_marks(v): |
| 155 | + return [v] |
136 | 156 |
|
137 | | -def get_marked_parameter_values(v): |
138 | | - return v.values |
| 157 | + def get_marked_parameter_values(v): |
| 158 | + return v.args[1:] |
139 | 159 |
|
140 | 160 |
|
141 | 161 | # ---- tools to reapply marks on test parameter values, whatever the pytest version ---- |
@@ -180,18 +200,22 @@ def transform_marks_into_decorators(marks): |
180 | 200 | try: |
181 | 201 | for m in marks: |
182 | 202 | md = pytest.mark.MarkDecorator() |
183 | | - if LooseVersion(pytest.__version__) >= LooseVersion('3.0.0'): |
184 | | - md.mark = m |
| 203 | + if isinstance(m, type(md)): |
| 204 | + # already a decorator, we can use it |
| 205 | + marks_mod.append(m) |
185 | 206 | else: |
186 | | - md.name = m.name |
187 | | - # md.markname = m.name |
188 | | - md.args = m.args |
189 | | - md.kwargs = m.kwargs |
190 | | - |
191 | | - # markinfodecorator = getattr(pytest.mark, markinfo.name) |
192 | | - # markinfodecorator(*markinfo.args) |
193 | | - |
194 | | - marks_mod.append(md) |
| 207 | + if LooseVersion(pytest.__version__) >= LooseVersion('3.0.0'): |
| 208 | + md.mark = m |
| 209 | + else: |
| 210 | + md.name = m.name |
| 211 | + # md.markname = m.name |
| 212 | + md.args = m.args |
| 213 | + md.kwargs = m.kwargs |
| 214 | + |
| 215 | + # markinfodecorator = getattr(pytest.mark, markinfo.name) |
| 216 | + # markinfodecorator(*markinfo.args) |
| 217 | + |
| 218 | + marks_mod.append(md) |
195 | 219 | except Exception as e: |
196 | 220 | warn("Caught exception while trying to mark case: [%s] %s" % (type(e), e)) |
197 | 221 | return marks_mod |
0 commit comments