|
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