1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/9bfbf2e88f1f/ Changeset: 9bfbf2e88f1f User: flub Date: 2013-12-15 23:15:15 Summary: Allow parameterised fixtures to give paramemter IDs
This is just like the markers etc already can do. Affected #: 3 files diff -r ec591a414d15677998d8214c5652c5d9fcef83e0 -r 9bfbf2e88f1fa635404968c1c0b72735634ddf27 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,9 @@ Unreleased ----------------------------------- +- Allow parameterized fixtures to specify the ID of the parameters by + adding an ids argument to pytest.fixture() and pytest.yield_fixture(). + - fix issue404 by always using the binary xml escape in the junitxml plugin 2.5.0 diff -r ec591a414d15677998d8214c5652c5d9fcef83e0 -r 9bfbf2e88f1fa635404968c1c0b72735634ddf27 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -35,11 +35,13 @@ class FixtureFunctionMarker: - def __init__(self, scope, params, autouse=False, yieldctx=False): + def __init__(self, scope, params, + autouse=False, yieldctx=False, ids=None): self.scope = scope self.params = params self.autouse = autouse self.yieldctx = yieldctx + self.ids = ids def __call__(self, function): if inspect.isclass(function): @@ -49,7 +51,7 @@ return function -def fixture(scope="function", params=None, autouse=False): +def fixture(scope="function", params=None, autouse=False, ids=None): """ (return a) decorator to mark a fixture factory function. This decorator can be used (with or or without parameters) to define @@ -71,6 +73,10 @@ can see it. If False (the default) then an explicit reference is needed to activate the fixture. + :arg ids: list of string ids each corresponding to the argvalues + so that they are part of the test id. If no ids are provided + they will be generated automatically from the argvalues. + """ if callable(scope) and params is None and autouse == False: # direct decoration @@ -78,9 +84,9 @@ "function", params, autouse)(scope) if params is not None and not isinstance(params, (list, tuple)): params = list(params) - return FixtureFunctionMarker(scope, params, autouse) + return FixtureFunctionMarker(scope, params, autouse, ids=ids) -def yield_fixture(scope="function", params=None, autouse=False): +def yield_fixture(scope="function", params=None, autouse=False, ids=None): """ (return a) decorator to mark a yield-fixture factory function (EXPERIMENTAL). @@ -94,7 +100,8 @@ return FixtureFunctionMarker( "function", params, autouse, yieldctx=True)(scope) else: - return FixtureFunctionMarker(scope, params, autouse, yieldctx=True) + return FixtureFunctionMarker(scope, params, autouse, + yieldctx=True, ids=ids) defaultfuncargprefixmarker = fixture() @@ -1623,7 +1630,8 @@ for fixturedef in faclist: if fixturedef.params is not None: metafunc.parametrize(argname, fixturedef.params, - indirect=True, scope=fixturedef.scope) + indirect=True, scope=fixturedef.scope, + ids=fixturedef.ids) def pytest_collection_modifyitems(self, items): # separate parametrized setups @@ -1660,7 +1668,7 @@ fixturedef = FixtureDef(self, nodeid, name, obj, marker.scope, marker.params, yieldctx=marker.yieldctx, - unittest=unittest) + unittest=unittest, ids=marker.ids) faclist = self._arg2fixturedefs.setdefault(name, []) if fixturedef.has_location: faclist.append(fixturedef) @@ -1728,7 +1736,7 @@ class FixtureDef: """ A container for a factory definition. """ def __init__(self, fixturemanager, baseid, argname, func, scope, params, - yieldctx, unittest=False): + yieldctx, unittest=False, ids=None): self._fixturemanager = fixturemanager self.baseid = baseid or '' self.has_location = baseid is not None @@ -1741,6 +1749,7 @@ self.argnames = getfuncargnames(func, startindex=startindex) self.yieldctx = yieldctx self.unittest = unittest + self.ids = ids self._finalizer = [] def addfinalizer(self, finalizer): diff -r ec591a414d15677998d8214c5652c5d9fcef83e0 -r 9bfbf2e88f1fa635404968c1c0b72735634ddf27 testing/python/fixture.py --- a/testing/python/fixture.py +++ b/testing/python/fixture.py @@ -1989,6 +1989,40 @@ reprec = testdir.inline_run() reprec.assertoutcome(passed=1) + def test_params_and_ids(self, testdir): + testdir.makepyfile(""" + import pytest + + @pytest.fixture(params=[object(), object()], + ids=['alpha', 'beta']) + def fix(request): + return request.param + + def test_foo(fix): + assert 1 + """) + res = testdir.runpytest('-v') + res.stdout.fnmatch_lines([ + '*test_foo*alpha*', + '*test_foo*beta*']) + + def test_params_and_ids_yieldfixture(self, testdir): + testdir.makepyfile(""" + import pytest + + @pytest.yield_fixture(params=[object(), object()], + ids=['alpha', 'beta']) + def fix(request): + yield request.param + + def test_foo(fix): + assert 1 + """) + res = testdir.runpytest('-v') + res.stdout.fnmatch_lines([ + '*test_foo*alpha*', + '*test_foo*beta*']) + class TestRequestScopeAccess: pytestmark = pytest.mark.parametrize(("scope", "ok", "error"),[ Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. _______________________________________________ pytest-commit mailing list pytest-commit@python.org https://mail.python.org/mailman/listinfo/pytest-commit