From 7690a0ddf15785f0af0e9a4cf8524379c53cd061 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 9 Feb 2024 14:59:04 +0100 Subject: [PATCH] Improve error message when using @pytest.fixture twice (#11670) * Improve error message when using @pytest.fixture twice While obvious in hindsight, this error message confused me. I thought my fixture function was used in a test function twice, since the wording is ambiguous. Also, the error does not tell me *which* function is the culprit. Finally, this adds a test, which wasn't done in cfd16d0dac1c935952b892bfbc225978c9b25de3 where this was originally implemented. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/_pytest/fixtures.py | 2 +- testing/python/fixtures.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/_pytest/fixtures.py b/src/_pytest/fixtures.py index b0bbc0e04..67eb05425 100644 --- a/src/_pytest/fixtures.py +++ b/src/_pytest/fixtures.py @@ -1188,7 +1188,7 @@ class FixtureFunctionMarker: if getattr(function, "_pytestfixturefunction", False): raise ValueError( - "fixture is being applied more than once to the same function" + f"@pytest.fixture is being applied more than once to the same function {function.__name__!r}" ) if hasattr(function, "pytestmark"): diff --git a/testing/python/fixtures.py b/testing/python/fixtures.py index 35ed2efc5..0fb5aa450 100644 --- a/testing/python/fixtures.py +++ b/testing/python/fixtures.py @@ -4353,6 +4353,27 @@ def test_call_fixture_function_error(): assert fix() == 1 +def test_fixture_double_decorator(pytester: Pytester) -> None: + """Check if an error is raised when using @pytest.fixture twice.""" + pytester.makepyfile( + """ + import pytest + + @pytest.fixture + @pytest.fixture + def fixt(): + pass + """ + ) + result = pytester.runpytest() + result.assert_outcomes(errors=1) + result.stdout.fnmatch_lines( + [ + "E * ValueError: @pytest.fixture is being applied more than once to the same function 'fixt'" + ] + ) + + def test_fixture_param_shadowing(pytester: Pytester) -> None: """Parametrized arguments would be shadowed if a fixture with the same name also exists (#5036)""" pytester.makepyfile(