coady/pytest-parametrized

View on GitHub
parametrized.py

Summary

Maintainability
A
0 mins
Test Coverage
import inspect
import itertools
from functools import partial
import pytest

__version__ = '1.5'


def parametrized(func, combine=None, **kwargs):
    """Decorate a function with combined parameters."""
    argspec = inspect.getfullargspec(func)
    params = dict(zip(reversed(argspec.args), reversed(argspec.defaults)))
    func.__defaults__ = ()  # pytest ignores params with defaults
    if combine is None:
        (args,) = params.items()  # multiple keywords require combine function, e.g., zip
    else:
        args = ','.join(params), combine(*params.values())
    return pytest.mark.parametrize(*args, **kwargs)(func)


def fixture(*params, **kwargs):
    return pytest.fixture(params=params, **kwargs)(lambda request: request.param)


parametrized.fixture = fixture
parametrized.zip = partial(parametrized, combine=zip)
parametrized.product = partial(parametrized, combine=itertools.product)