Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ pip install pytest-parametrization
## How to use
### Explicit parameters
```python
import pytest
from parametrization import Parametrization

@Parametrization.parameters("actual", "expected")
Expand All @@ -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
Expand Down
18 changes: 11 additions & 7 deletions parametrization.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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]
Expand All @@ -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]
Expand Down Expand Up @@ -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

Expand Down