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
[email protected]
https://mail.python.org/mailman/listinfo/pytest-commit