Skip to content

Allow custom fixture names for fixtures #1444

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ Matt Williams
Michael Aquilina
Michael Birtwell
Michael Droettboom
Mike Lundy
Nicolas Delaby
Pieter Mulder
Piotr Banaszkiewicz
Expand Down
8 changes: 7 additions & 1 deletion CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@
namespace in which your doctests run.
Thanks `@milliams`_ for the complete PR (`#1428`_).

*
* New ``name`` argument to ``pytest.fixture`` mark, which allows a custom name
for a fixture (to solve the funcarg-shadowing-fixture problem).
Thanks `@novas0x2a`_ for the complete PR (`#1444`_).

*

*

Expand All @@ -21,8 +25,10 @@
*

.. _@milliams: https://github.com/milliams
.. _@novas0x2a: https://github.com/novas0x2a

.. _#1428: https://github.com/pytest-dev/pytest/pull/1428
.. _#1444: https://github.com/pytest-dev/pytest/pull/1444


2.9.1.dev1
Expand Down
18 changes: 14 additions & 4 deletions _pytest/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,13 @@ def safe_getattr(object, name, default):

class FixtureFunctionMarker:
def __init__(self, scope, params,
autouse=False, yieldctx=False, ids=None):
autouse=False, yieldctx=False, ids=None, name=None):
self.scope = scope
self.params = params
self.autouse = autouse
self.yieldctx = yieldctx
self.ids = ids
self.name = name

def __call__(self, function):
if isclass(function):
Expand All @@ -129,7 +130,7 @@ def __call__(self, function):
return function


def fixture(scope="function", params=None, autouse=False, ids=None):
def fixture(scope="function", params=None, autouse=False, ids=None, name=None):
""" (return a) decorator to mark a fixture factory function.

This decorator can be used (with or or without parameters) to define
Expand All @@ -155,14 +156,21 @@ def fixture(scope="function", params=None, autouse=False, ids=None):
so that they are part of the test id. If no ids are provided
they will be generated automatically from the params.

:arg name: the name of the fixture. This defaults to the name of the
decorated function. If a fixture is used in the same module in
which it is defined, the function name of the fixture will be
shadowed by the function arg that requests the fixture; one way
to resolve this is to name the decorated function
``fixture_<fixturename>`` and then use
``@pytest.fixture(name='<fixturename>')``.
"""
if callable(scope) and params is None and autouse == False:
# direct decoration
return FixtureFunctionMarker(
"function", params, autouse)(scope)
"function", params, autouse, name=name)(scope)
if params is not None and not isinstance(params, (list, tuple)):
params = list(params)
return FixtureFunctionMarker(scope, params, autouse, ids=ids)
return FixtureFunctionMarker(scope, params, autouse, ids=ids, name=name)

def yield_fixture(scope="function", params=None, autouse=False, ids=None):
""" (return a) decorator to mark a yield-fixture factory function
Expand Down Expand Up @@ -1989,6 +1997,8 @@ def parsefactories(self, node_or_obj, nodeid=NOTSET, unittest=False):
# fixture attribute
continue
else:
if marker.name:
name = marker.name
assert not name.startswith(self._argprefix)
fixturedef = FixtureDef(self, nodeid, name, obj,
marker.scope, marker.params,
Expand Down
11 changes: 11 additions & 0 deletions testing/python/fixture.py
Original file line number Diff line number Diff line change
Expand Up @@ -2691,3 +2691,14 @@ def test_1(arg1):
*def arg1*
""")

def test_custom_name(self, testdir):
testdir.makepyfile("""
import pytest
@pytest.fixture(name='meow')
def arg1():
return 'mew'
def test_1(meow):
print(meow)
""")
result = testdir.runpytest("-s")
result.stdout.fnmatch_lines("*mew*")