diff --git a/src/_pytest/config/__init__.py b/src/_pytest/config/__init__.py index e1ceb7737..2d6693808 100644 --- a/src/_pytest/config/__init__.py +++ b/src/_pytest/config/__init__.py @@ -348,18 +348,21 @@ def _get_legacy_hook_marks( hook_type: str, opt_names: Tuple[str, ...], ) -> Dict[str, bool]: - known_marks = {m.name for m in getattr(method, "pytestmark", [])} - must_warn = False - opts = {} + known_marks: set[str] = {m.name for m in getattr(method, "pytestmark", [])} + must_warn: list[str] = [] + opts: dict[str, bool] = {} for opt_name in opt_names: + opt_attr = getattr(method, opt_name, AttributeError) + if opt_attr is not AttributeError: + must_warn.append(f"{opt_name}={opt_attr}") + elif opt_name in known_marks: + must_warn.append(f"{opt_name}=True") if hasattr(method, opt_name) or opt_name in known_marks: opts[opt_name] = True - must_warn = True else: opts[opt_name] = False if must_warn: - - hook_opts = ", ".join(f"{name}=True" for name, val in opts.items() if val) + hook_opts = ", ".join(must_warn) message = _pytest.deprecated.HOOK_LEGACY_MARKING.format( type=hook_type, fullname=method.__qualname__, # type: ignore diff --git a/testing/deprecated_test.py b/testing/deprecated_test.py index 8847695a7..d468b4435 100644 --- a/testing/deprecated_test.py +++ b/testing/deprecated_test.py @@ -29,11 +29,11 @@ def test_hookspec_via_function_attributes_are_deprecated(): def pytest_bad_hook(self): pass - pytest_bad_hook.historic = True # type: ignore[attr-defined] + pytest_bad_hook.historic = False # type: ignore[attr-defined] with pytest.warns( PytestDeprecationWarning, - match=r"Please use the pytest\.hookspec\(historic=True\) decorator", + match=r"Please use the pytest\.hookspec\(historic=False\) decorator", ) as recorder: pm.add_hookspecs(DeprecatedHookMarkerSpec) (record,) = recorder