Skip to content

Commit

Permalink
Added pytest_make_parametrize_id hook
Browse files Browse the repository at this point in the history
  • Loading branch information
palaviv committed Apr 25, 2016
1 parent 52babba commit 7992742
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 6 deletions.
6 changes: 6 additions & 0 deletions _pytest/hookspec.py
Expand Up @@ -133,6 +133,12 @@ def pytest_deselected(items):
def pytest_make_collect_report(collector):
""" perform ``collector.collect()`` and return a CollectReport. """

@hookspec(firstresult=True)
def pytest_make_parametrize_id(val):
"""Return a user-friendly string representation of the given ``val`` that will be used
by @pytest.mark.parametrize calls. Return None if the hook doesn't know about ``val``.
"""

# -------------------------------------------------------------------------
# Python test function related hooks
# -------------------------------------------------------------------------
Expand Down
20 changes: 14 additions & 6 deletions _pytest/python.py
Expand Up @@ -342,6 +342,9 @@ def pytest_pycollect_makeitem(collector, name, obj):
res = list(collector._genfunctions(name, obj))
outcome.force_result(res)

def pytest_make_parametrize_id(val):
return None

def is_generator(func):
try:
return _pytest._code.getrawcode(func).co_flags & 32 # generator function
Expand Down Expand Up @@ -1030,7 +1033,7 @@ def parametrize(self, argnames, argvalues, indirect=False, ids=None,
if ids and len(ids) != len(argvalues):
raise ValueError('%d tests specified with %d ids' %(
len(argvalues), len(ids)))
ids = idmaker(argnames, argvalues, idfn, ids)
ids = idmaker(argnames, argvalues, idfn, ids, self.config)
newcalls = []
for callspec in self._calls or [CallSpec2(self)]:
for param_index, valset in enumerate(argvalues):
Expand Down Expand Up @@ -1130,7 +1133,7 @@ def _escape_strings(val):
return val.encode('unicode-escape')


def _idval(val, argname, idx, idfn):
def _idval(val, argname, idx, idfn, config):
if idfn:
try:
s = idfn(val)
Expand All @@ -1139,6 +1142,11 @@ def _idval(val, argname, idx, idfn):
except Exception:
pass

if config:
hook_id = config.hook.pytest_make_parametrize_id(val=val)
if hook_id:
return hook_id

if isinstance(val, (bytes, str)) or (_PY2 and isinstance(val, unicode)):
return _escape_strings(val)
elif isinstance(val, (float, int, bool, NoneType)):
Expand All @@ -1151,16 +1159,16 @@ def _idval(val, argname, idx, idfn):
return val.__name__
return str(argname)+str(idx)

def _idvalset(idx, valset, argnames, idfn, ids):
def _idvalset(idx, valset, argnames, idfn, ids, config):
if ids is None or ids[idx] is None:
this_id = [_idval(val, argname, idx, idfn)
this_id = [_idval(val, argname, idx, idfn, config)
for val, argname in zip(valset, argnames)]
return "-".join(this_id)
else:
return _escape_strings(ids[idx])

def idmaker(argnames, argvalues, idfn=None, ids=None):
ids = [_idvalset(valindex, valset, argnames, idfn, ids)
def idmaker(argnames, argvalues, idfn=None, ids=None, config=None):
ids = [_idvalset(valindex, valset, argnames, idfn, ids, config)
for valindex, valset in enumerate(argvalues)]
if len(set(ids)) != len(ids):
# The ids are not unique
Expand Down

0 comments on commit 7992742

Please sign in to comment.