Added pytest_make_parametrize_id hook
This commit is contained in:
parent
52babba33e
commit
79927428d1
|
@ -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
|
||||
# -------------------------------------------------------------------------
|
||||
|
|
|
@ -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
|
||||
|
@ -1030,7 +1033,7 @@ class Metafunc(FuncargnamesCompatAttr):
|
|||
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):
|
||||
|
@ -1130,7 +1133,7 @@ else:
|
|||
return val.encode('unicode-escape')
|
||||
|
||||
|
||||
def _idval(val, argname, idx, idfn):
|
||||
def _idval(val, argname, idx, idfn, config):
|
||||
if idfn:
|
||||
try:
|
||||
s = idfn(val)
|
||||
|
@ -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)):
|
||||
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue