From 7b6b2b16f0139dff9639fe7b6e9fd18213cc0667 Mon Sep 17 00:00:00 2001 From: smheidrich Date: Tue, 1 Aug 2023 02:47:03 +0200 Subject: [PATCH] Add marks kwarg to case(), allow applying markers --- README.md | 7 +++++++ parametrization.py | 18 +++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c442ccc..506da65 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ pip install pytest-parametrization ## How to use ### Explicit parameters ```python +import pytest from parametrization import Parametrization @Parametrization.parameters("actual", "expected") @@ -18,9 +19,15 @@ from parametrization import Parametrization @Parametrization.case("some_case_2", 1, expected=1) @Parametrization.case("some_case_3", 2, 2) @Parametrization.case("some_case_4", 3, 3) +@Parametrization.case("some_case_5", 4, 5, marks=pytest.mark.xfail) def test_somthing(actual, expected): assert actual == expected ``` + +Note that both the `name` and `marks` keyword arguments are reserved for +special purposes as shown above, so parameters with these names must have their +values provided as positional arguments. + ### Auto-detect parameters ```python from parametrization import Parametrization diff --git a/parametrization.py b/parametrization.py index fd17ceb..ea0b9d4 100644 --- a/parametrization.py +++ b/parametrization.py @@ -19,7 +19,7 @@ def get_decorated(self, parameters=None): if parameters is None: parameters = set() for case in self.cases: - name, args, kwargs = case + name, args, kwargs, marks = case if args: raise Exception("args are forbidden with auto-detection, please use kwargs") parameters.update(six.viewkeys(kwargs)) @@ -33,7 +33,7 @@ def get_decorated(self, parameters=None): case_cls = _namedtuple('Case', arguments_names) - for name, args, kwargs in reversed(self.cases): + for name, args, kwargs, marks in reversed(self.cases): for argument_name in arguments_names[len(args):]: if argument_name not in kwargs and argument_name in self.defaults: kwargs[argument_name] = self.defaults[argument_name] @@ -44,14 +44,18 @@ def get_decorated(self, parameters=None): ids.append(name) - arguments_values.append(tuple(case_cls(*args, **kwargs))) + argument_value = tuple(case_cls(*args, **kwargs)) + if marks is not None: + argument_value = pytest.param(*argument_value, marks=marks) + + arguments_values.append(argument_value) return pytest.mark.parametrize(argnames=arguments_names, argvalues=arguments_values, ids=ids)(self.test_function) - def add_case(self, name, *args, **kwargs): - self.cases.append((name, args, kwargs)) + def add_case(self, name, *args, marks=None, **kwargs): + self.cases.append((name, args, kwargs, marks)) def add_legacy_cases(self, base_name, fields, values): fields_with_values = [dict(zip(fields, value)) for value in values] @@ -92,13 +96,13 @@ def decorator(f): return decorator @classmethod - def case(cls, name=None, *args, **kwargs): + def case(cls, name=None, *args, marks=None, **kwargs): def decorator(f): if not isinstance(f, Parametrization): parametrization = Parametrization(f) else: parametrization = f - parametrization.add_case(name, *args, **kwargs) + parametrization.add_case(name, *args, marks=marks, **kwargs) return parametrization