Pass parameter name to `make_parametrize_id` hook function

This commit is contained in:
Ravi Chandra 2017-01-16 16:09:46 +13:00
parent 88f7befabb
commit c848d0a771
5 changed files with 34 additions and 3 deletions

View File

@ -120,6 +120,7 @@ Quentin Pradet
Ralf Schmitt
Raphael Pierzina
Raquel Alegre
Ravi Chandra
Roberto Polli
Romain Dorgueil
Roman Bolshakov

View File

@ -79,10 +79,15 @@ Changes
subdirectories with ini configuration files now uses the correct ini file
(`#2148`_). Thanks `@pelme`_.
* Modify ``pytest_make_parametrize_id()`` hook to accept ``argname`` as an
additional parameter.
Thanks `@unsignedint`_ for the PR.
*
.. _@malinoff: https://github.com/malinoff
.. _@pelme: https://github.com/pelme
.. _@unsignedint: https://github.com/unsignedint
.. _#2129: https://github.com/pytest-dev/pytest/issues/2129
.. _#2148: https://github.com/pytest-dev/pytest/issues/2148

View File

@ -157,9 +157,10 @@ def pytest_generate_tests(metafunc):
""" generate (multiple) parametrized calls to a test function."""
@hookspec(firstresult=True)
def pytest_make_parametrize_id(config, val):
def pytest_make_parametrize_id(config, val, argname=None):
"""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``.
The parameter name is available as ``argname``, if required.
"""
# -------------------------------------------------------------------------

View File

@ -197,7 +197,7 @@ def pytest_pycollect_makeitem(collector, name, obj):
res = list(collector._genfunctions(name, obj))
outcome.force_result(res)
def pytest_make_parametrize_id(config, val):
def pytest_make_parametrize_id(config, val, argname=None):
return None
@ -941,7 +941,8 @@ def _idval(val, argname, idx, idfn, config=None):
return _escape_strings(s)
if config:
hook_id = config.hook.pytest_make_parametrize_id(config=config, val=val)
hook_id = config.hook.pytest_make_parametrize_id(
config=config, val=val, argname=argname)
if hook_id:
return hook_id

View File

@ -1455,3 +1455,26 @@ class TestMarkersWithParametrization:
"*test_func*0*PASS*",
"*test_func*2*PASS*",
])
def test_pytest_make_parametrize_id_with_argname(self, testdir):
testdir.makeconftest("""
def pytest_make_parametrize_id(config, val, argname):
return str(val * 2 if argname == 'x' else val * 10)
""")
testdir.makepyfile("""
import pytest
@pytest.mark.parametrize("x", range(2))
def test_func(x):
pass
@pytest.mark.parametrize("y", [1])
def test_func2(y):
pass
""")
result = testdir.runpytest("-v")
result.stdout.fnmatch_lines([
"*test_func*0*PASS*",
"*test_func*2*PASS*",
"*test_func2*10*PASS*",
])