diff --git a/changelog/7210.deprecation.rst b/changelog/7210.deprecation.rst new file mode 100644 index 00000000000..3e1350eaa79 --- /dev/null +++ b/changelog/7210.deprecation.rst @@ -0,0 +1,5 @@ +The special ``-k '-expr'`` syntax to ``-k`` is deprecated. Use ``-k 'not expr'`` +instead. + +The special ``-k 'expr:'`` syntax to ``-k`` is deprecated. Please open an issue +if you use this and want a replacement. diff --git a/src/_pytest/deprecated.py b/src/_pytest/deprecated.py index 8c9bd9d5c42..9f4570f85b0 100644 --- a/src/_pytest/deprecated.py +++ b/src/_pytest/deprecated.py @@ -75,3 +75,13 @@ "The TerminalReporter.writer attribute is deprecated, use TerminalReporter._tw instead at your own risk.\n" "See https://docs.pytest.org/en/latest/deprecations.html#terminalreporter-writer for more information." ) + + +MINUS_K_DASH = PytestDeprecationWarning( + "The `-k '-expr'` syntax to -k is deprecated.\nUse `-k 'not expr'` instead." +) + +MINUS_K_COLON = PytestDeprecationWarning( + "The `-k 'expr:'` syntax to -k is deprecated.\n" + "Please open an issue if you use this and want a replacement." +) diff --git a/src/_pytest/mark/__init__.py b/src/_pytest/mark/__init__.py index 36245c25a05..f7556b0b761 100644 --- a/src/_pytest/mark/__init__.py +++ b/src/_pytest/mark/__init__.py @@ -1,4 +1,5 @@ """ generic mechanism for marking and selecting python functions. """ +import warnings from typing import Optional from .legacy import matchkeyword @@ -13,6 +14,8 @@ from _pytest.config import Config from _pytest.config import hookimpl from _pytest.config import UsageError +from _pytest.deprecated import MINUS_K_COLON +from _pytest.deprecated import MINUS_K_DASH from _pytest.store import StoreKey __all__ = ["Mark", "MarkDecorator", "MarkGenerator", "get_empty_parameterset_mark"] @@ -107,9 +110,13 @@ def deselect_by_keyword(items, config): return if keywordexpr.startswith("-"): + # To be removed in pytest 7.0.0. + warnings.warn(MINUS_K_DASH, stacklevel=2) keywordexpr = "not " + keywordexpr[1:] selectuntil = False if keywordexpr[-1:] == ":": + # To be removed in pytest 7.0.0. + warnings.warn(MINUS_K_COLON, stacklevel=2) selectuntil = True keywordexpr = keywordexpr[:-1] diff --git a/testing/deprecated_test.py b/testing/deprecated_test.py index 5ad055bd21e..edd5505c03d 100644 --- a/testing/deprecated_test.py +++ b/testing/deprecated_test.py @@ -164,3 +164,27 @@ def test__fillfuncargs_is_deprecated() -> None: match="The `_fillfuncargs` function is deprecated", ): pytest._fillfuncargs(mock.Mock()) + + +def test_minus_k_dash_is_deprecated(testdir) -> None: + threepass = testdir.makepyfile( + test_threepass=""" + def test_one(): assert 1 + def test_two(): assert 1 + def test_three(): assert 1 + """ + ) + result = testdir.runpytest("-k=-test_two", threepass) + result.stdout.fnmatch_lines(["*The `-k '-expr'` syntax*deprecated*"]) + + +def test_minus_k_colon_is_deprecated(testdir) -> None: + threepass = testdir.makepyfile( + test_threepass=""" + def test_one(): assert 1 + def test_two(): assert 1 + def test_three(): assert 1 + """ + ) + result = testdir.runpytest("-k", "test_two:", threepass) + result.stdout.fnmatch_lines(["*The `-k 'expr:'` syntax*deprecated*"])