Further "unknown marks warning" improvements (#5178)
Further "unknown marks warning" improvements
This commit is contained in:
		
						commit
						465b2d998a
					
				|  | @ -0,0 +1,5 @@ | |||
| New flag ``--strict-markers`` that triggers an error when unknown markers (e.g. those not registered using the `markers option`_ in the configuration file) are used in the test suite. | ||||
| 
 | ||||
| The existing ``--strict`` option has the same behavior currently, but can be augmented in the future for additional checks. | ||||
| 
 | ||||
| .. _`markers option`: https://docs.pytest.org/en/latest/reference.html#confval-markers | ||||
|  | @ -259,7 +259,7 @@ For an example on how to add and work with markers from a plugin, see | |||
|     * Asking for existing markers via ``pytest --markers`` gives good output | ||||
| 
 | ||||
|     * Typos in function markers are treated as an error if you use | ||||
|       the ``--strict`` option. | ||||
|       the ``--strict-markers`` option. | ||||
| 
 | ||||
| .. _`scoped-marking`: | ||||
| 
 | ||||
|  |  | |||
|  | @ -41,15 +41,15 @@ marks by registering them in ``pytest.ini`` like this: | |||
|         slow | ||||
|         serial | ||||
| 
 | ||||
| When the ``--strict`` command-line flag is passed, any unknown marks applied | ||||
| When the ``--strict-markers`` command-line flag is passed, any unknown marks applied | ||||
| with the ``@pytest.mark.name_of_the_mark`` decorator will trigger an error. | ||||
| Marks added by pytest or by a plugin instead of the decorator will not trigger | ||||
| this error.  To enforce validation of markers, add ``--strict`` to ``addopts``: | ||||
| this error.  To enforce validation of markers, add ``--strict-markers`` to ``addopts``: | ||||
| 
 | ||||
| .. code-block:: ini | ||||
| 
 | ||||
|     [pytest] | ||||
|     addopts = --strict | ||||
|     addopts = --strict-markers | ||||
|     markers = | ||||
|         slow | ||||
|         serial | ||||
|  |  | |||
|  | @ -1269,15 +1269,17 @@ passed multiple times. The expected format is ``name=value``. For example:: | |||
| 
 | ||||
| .. confval:: markers | ||||
| 
 | ||||
|     When the ``--strict`` command-line argument is used, only known markers - | ||||
|     defined in code by core pytest or some plugin - are allowed. | ||||
|     You can list additional markers in this setting to add them to the whitelist. | ||||
|     When the ``--strict-markers`` or ``--strict`` command-line arguments are used, | ||||
|     only known markers - defined in code by core pytest or some plugin - are allowed. | ||||
| 
 | ||||
|     You can list one marker name per line, indented from the option name. | ||||
|     You can list additional markers in this setting to add them to the whitelist, | ||||
|     in which case you probably want to add ``--strict-markers`` to ``addopts`` | ||||
|     to avoid future regressions: | ||||
| 
 | ||||
|     .. code-block:: ini | ||||
| 
 | ||||
|         [pytest] | ||||
|         addopts = --strict-markers | ||||
|         markers = | ||||
|             slow | ||||
|             serial | ||||
|  |  | |||
|  | @ -47,11 +47,6 @@ def pytest_addoption(parser): | |||
|         type="args", | ||||
|         default=[], | ||||
|     ) | ||||
|     # parser.addini("dirpatterns", | ||||
|     #    "patterns specifying possible locations of test files", | ||||
|     #    type="linelist", default=["**/test_*.txt", | ||||
|     #            "**/test_*.py", "**/*_test.py"] | ||||
|     # ) | ||||
|     group = parser.getgroup("general", "running and selection options") | ||||
|     group._addoption( | ||||
|         "-x", | ||||
|  | @ -71,9 +66,10 @@ def pytest_addoption(parser): | |||
|         help="exit after first num failures or errors.", | ||||
|     ) | ||||
|     group._addoption( | ||||
|         "--strict-markers", | ||||
|         "--strict", | ||||
|         action="store_true", | ||||
|         help="marks not registered in configuration file raise errors.", | ||||
|         help="markers not registered in the `markers` section of the configuration file raise errors.", | ||||
|     ) | ||||
|     group._addoption( | ||||
|         "-c", | ||||
|  |  | |||
|  | @ -311,8 +311,11 @@ class MarkGenerator(object): | |||
|             # If the name is not in the set of known marks after updating, | ||||
|             # then it really is time to issue a warning or an error. | ||||
|             if name not in self._markers: | ||||
|                 if self._config.option.strict: | ||||
|                     fail("{!r} is not a registered marker".format(name), pytrace=False) | ||||
|                 if self._config.option.strict_markers: | ||||
|                     fail( | ||||
|                         "{!r} not found in `markers` configuration option".format(name), | ||||
|                         pytrace=False, | ||||
|                     ) | ||||
|                 else: | ||||
|                     warnings.warn( | ||||
|                         "Unknown pytest.mark.%s - is this a typo?  You can register " | ||||
|  |  | |||
|  | @ -11,7 +11,6 @@ import textwrap | |||
| import py | ||||
| import six | ||||
| from six.moves import queue | ||||
| from test_source import astonly | ||||
| 
 | ||||
| import _pytest | ||||
| import pytest | ||||
|  | @ -147,7 +146,6 @@ class TestTraceback_f_g_h(object): | |||
|         assert s.startswith("def f():") | ||||
|         assert s.endswith("raise ValueError") | ||||
| 
 | ||||
|     @astonly | ||||
|     @failsonjython | ||||
|     def test_traceback_entry_getsource_in_construct(self): | ||||
|         source = _pytest._code.Source( | ||||
|  |  | |||
|  | @ -16,7 +16,6 @@ import _pytest._code | |||
| import pytest | ||||
| from _pytest._code import Source | ||||
| 
 | ||||
| astonly = pytest.mark.nothing | ||||
| failsonjython = pytest.mark.xfail("sys.platform.startswith('java')") | ||||
| 
 | ||||
| 
 | ||||
|  | @ -227,7 +226,6 @@ class TestSourceParsingAndCompiling(object): | |||
|         s = source.getstatement(1) | ||||
|         assert s == str(source) | ||||
| 
 | ||||
|     @astonly | ||||
|     def test_getstatementrange_within_constructs(self): | ||||
|         source = Source( | ||||
|             """\ | ||||
|  | @ -630,7 +628,6 @@ x = 3 | |||
| 
 | ||||
| 
 | ||||
| class TestTry(object): | ||||
|     pytestmark = astonly | ||||
|     source = """\ | ||||
| try: | ||||
|     raise ValueError | ||||
|  | @ -675,7 +672,6 @@ finally: | |||
| 
 | ||||
| 
 | ||||
| class TestIf(object): | ||||
|     pytestmark = astonly | ||||
|     source = """\ | ||||
| if 1: | ||||
|     y = 3 | ||||
|  |  | |||
|  | @ -1925,10 +1925,10 @@ class TestAutouseManagement(object): | |||
|         reprec = testdir.inline_run() | ||||
|         reprec.assertoutcome(passed=1) | ||||
| 
 | ||||
|     @pytest.mark.issue(226) | ||||
|     @pytest.mark.parametrize("param1", ["", "params=[1]"], ids=["p00", "p01"]) | ||||
|     @pytest.mark.parametrize("param2", ["", "params=[1]"], ids=["p10", "p11"]) | ||||
|     def test_ordering_dependencies_torndown_first(self, testdir, param1, param2): | ||||
|         """#226""" | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|             import pytest | ||||
|  | @ -2707,9 +2707,9 @@ class TestFixtureMarker(object): | |||
|         reprec = testdir.inline_run("-v") | ||||
|         reprec.assertoutcome(passed=5) | ||||
| 
 | ||||
|     @pytest.mark.issue(246) | ||||
|     @pytest.mark.parametrize("scope", ["session", "function", "module"]) | ||||
|     def test_finalizer_order_on_parametrization(self, scope, testdir): | ||||
|         """#246""" | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|             import pytest | ||||
|  | @ -2744,8 +2744,8 @@ class TestFixtureMarker(object): | |||
|         reprec = testdir.inline_run("-lvs") | ||||
|         reprec.assertoutcome(passed=3) | ||||
| 
 | ||||
|     @pytest.mark.issue(396) | ||||
|     def test_class_scope_parametrization_ordering(self, testdir): | ||||
|         """#396""" | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|             import pytest | ||||
|  | @ -2865,8 +2865,8 @@ class TestFixtureMarker(object): | |||
|         res = testdir.runpytest("-v") | ||||
|         res.stdout.fnmatch_lines(["*test_foo*alpha*", "*test_foo*beta*"]) | ||||
| 
 | ||||
|     @pytest.mark.issue(920) | ||||
|     def test_deterministic_fixture_collection(self, testdir, monkeypatch): | ||||
|         """#920""" | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|             import pytest | ||||
|  | @ -3649,7 +3649,6 @@ class TestScopeOrdering(object): | |||
|     """Class of tests that ensure fixtures are ordered based on their scopes (#2405)""" | ||||
| 
 | ||||
|     @pytest.mark.parametrize("variant", ["mark", "autouse"]) | ||||
|     @pytest.mark.issue(github="#2405") | ||||
|     def test_func_closure_module_auto(self, testdir, variant, monkeypatch): | ||||
|         """Semantically identical to the example posted in #2405 when ``use_mark=True``""" | ||||
|         monkeypatch.setenv("FIXTURE_ACTIVATION_VARIANT", variant) | ||||
|  |  | |||
|  | @ -393,8 +393,9 @@ class TestNoselikeTestAttribute(object): | |||
|         assert not call.items | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.issue(351) | ||||
| class TestParameterize(object): | ||||
|     """#351""" | ||||
| 
 | ||||
|     def test_idfn_marker(self, testdir): | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|  |  | |||
|  | @ -159,8 +159,9 @@ class TestMetafunc(object): | |||
|                 ("x", "y"), [("abc", "def"), ("ghi", "jkl")], ids=["one"] | ||||
|             ) | ||||
| 
 | ||||
|     @pytest.mark.issue(510) | ||||
|     def test_parametrize_empty_list(self): | ||||
|         """#510""" | ||||
| 
 | ||||
|         def func(y): | ||||
|             pass | ||||
| 
 | ||||
|  | @ -262,8 +263,8 @@ class TestMetafunc(object): | |||
|         for val, expected in values: | ||||
|             assert _idval(val, "a", 6, None, item=None, config=None) == expected | ||||
| 
 | ||||
|     @pytest.mark.issue(250) | ||||
|     def test_idmaker_autoname(self): | ||||
|         """#250""" | ||||
|         from _pytest.python import idmaker | ||||
| 
 | ||||
|         result = idmaker( | ||||
|  | @ -356,8 +357,8 @@ class TestMetafunc(object): | |||
|         result = idmaker(("a", "b"), [pytest.param(e.one, e.two)]) | ||||
|         assert result == ["Foo.one-Foo.two"] | ||||
| 
 | ||||
|     @pytest.mark.issue(351) | ||||
|     def test_idmaker_idfn(self): | ||||
|         """#351""" | ||||
|         from _pytest.python import idmaker | ||||
| 
 | ||||
|         def ids(val): | ||||
|  | @ -375,8 +376,8 @@ class TestMetafunc(object): | |||
|         ) | ||||
|         assert result == ["10.0-IndexError()", "20-KeyError()", "three-b2"] | ||||
| 
 | ||||
|     @pytest.mark.issue(351) | ||||
|     def test_idmaker_idfn_unique_names(self): | ||||
|         """#351""" | ||||
|         from _pytest.python import idmaker | ||||
| 
 | ||||
|         def ids(val): | ||||
|  | @ -459,8 +460,9 @@ class TestMetafunc(object): | |||
|         ) | ||||
|         assert result == ["a0", "a1", "b0", "c", "b1"] | ||||
| 
 | ||||
|     @pytest.mark.issue(714) | ||||
|     def test_parametrize_indirect(self): | ||||
|         """#714""" | ||||
| 
 | ||||
|         def func(x, y): | ||||
|             pass | ||||
| 
 | ||||
|  | @ -473,8 +475,9 @@ class TestMetafunc(object): | |||
|         assert metafunc._calls[0].params == dict(x=1, y=2) | ||||
|         assert metafunc._calls[1].params == dict(x=1, y=3) | ||||
| 
 | ||||
|     @pytest.mark.issue(714) | ||||
|     def test_parametrize_indirect_list(self): | ||||
|         """#714""" | ||||
| 
 | ||||
|         def func(x, y): | ||||
|             pass | ||||
| 
 | ||||
|  | @ -483,8 +486,9 @@ class TestMetafunc(object): | |||
|         assert metafunc._calls[0].funcargs == dict(y="b") | ||||
|         assert metafunc._calls[0].params == dict(x="a") | ||||
| 
 | ||||
|     @pytest.mark.issue(714) | ||||
|     def test_parametrize_indirect_list_all(self): | ||||
|         """#714""" | ||||
| 
 | ||||
|         def func(x, y): | ||||
|             pass | ||||
| 
 | ||||
|  | @ -493,8 +497,9 @@ class TestMetafunc(object): | |||
|         assert metafunc._calls[0].funcargs == {} | ||||
|         assert metafunc._calls[0].params == dict(x="a", y="b") | ||||
| 
 | ||||
|     @pytest.mark.issue(714) | ||||
|     def test_parametrize_indirect_list_empty(self): | ||||
|         """#714""" | ||||
| 
 | ||||
|         def func(x, y): | ||||
|             pass | ||||
| 
 | ||||
|  | @ -503,9 +508,9 @@ class TestMetafunc(object): | |||
|         assert metafunc._calls[0].funcargs == dict(x="a", y="b") | ||||
|         assert metafunc._calls[0].params == {} | ||||
| 
 | ||||
|     @pytest.mark.issue(714) | ||||
|     def test_parametrize_indirect_list_functional(self, testdir): | ||||
|         """ | ||||
|         #714 | ||||
|         Test parametrization with 'indirect' parameter applied on | ||||
|         particular arguments. As y is is direct, its value should | ||||
|         be used directly rather than being passed to the fixture | ||||
|  | @ -532,8 +537,9 @@ class TestMetafunc(object): | |||
|         result = testdir.runpytest("-v") | ||||
|         result.stdout.fnmatch_lines(["*test_simple*a-b*", "*1 passed*"]) | ||||
| 
 | ||||
|     @pytest.mark.issue(714) | ||||
|     def test_parametrize_indirect_list_error(self, testdir): | ||||
|         """#714""" | ||||
| 
 | ||||
|         def func(x, y): | ||||
|             pass | ||||
| 
 | ||||
|  | @ -541,12 +547,13 @@ class TestMetafunc(object): | |||
|         with pytest.raises(pytest.fail.Exception): | ||||
|             metafunc.parametrize("x, y", [("a", "b")], indirect=["x", "z"]) | ||||
| 
 | ||||
|     @pytest.mark.issue(714) | ||||
|     def test_parametrize_uses_no_fixture_error_indirect_false(self, testdir): | ||||
|         """The 'uses no fixture' error tells the user at collection time | ||||
|         that the parametrize data they've set up doesn't correspond to the | ||||
|         fixtures in their test function, rather than silently ignoring this | ||||
|         and letting the test potentially pass. | ||||
| 
 | ||||
|         #714 | ||||
|         """ | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|  | @ -560,8 +567,8 @@ class TestMetafunc(object): | |||
|         result = testdir.runpytest("--collect-only") | ||||
|         result.stdout.fnmatch_lines(["*uses no argument 'y'*"]) | ||||
| 
 | ||||
|     @pytest.mark.issue(714) | ||||
|     def test_parametrize_uses_no_fixture_error_indirect_true(self, testdir): | ||||
|         """#714""" | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|             import pytest | ||||
|  | @ -580,8 +587,8 @@ class TestMetafunc(object): | |||
|         result = testdir.runpytest("--collect-only") | ||||
|         result.stdout.fnmatch_lines(["*uses no fixture 'y'*"]) | ||||
| 
 | ||||
|     @pytest.mark.issue(714) | ||||
|     def test_parametrize_indirect_uses_no_fixture_error_indirect_string(self, testdir): | ||||
|         """#714""" | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|             import pytest | ||||
|  | @ -597,8 +604,8 @@ class TestMetafunc(object): | |||
|         result = testdir.runpytest("--collect-only") | ||||
|         result.stdout.fnmatch_lines(["*uses no fixture 'y'*"]) | ||||
| 
 | ||||
|     @pytest.mark.issue(714) | ||||
|     def test_parametrize_indirect_uses_no_fixture_error_indirect_list(self, testdir): | ||||
|         """#714""" | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|             import pytest | ||||
|  | @ -614,8 +621,8 @@ class TestMetafunc(object): | |||
|         result = testdir.runpytest("--collect-only") | ||||
|         result.stdout.fnmatch_lines(["*uses no fixture 'y'*"]) | ||||
| 
 | ||||
|     @pytest.mark.issue(714) | ||||
|     def test_parametrize_argument_not_in_indirect_list(self, testdir): | ||||
|         """#714""" | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|             import pytest | ||||
|  | @ -1201,9 +1208,9 @@ class TestMetafuncFunctional(object): | |||
|         reprec = testdir.runpytest() | ||||
|         reprec.assert_outcomes(passed=4) | ||||
| 
 | ||||
|     @pytest.mark.issue(463) | ||||
|     @pytest.mark.parametrize("attr", ["parametrise", "parameterize", "parameterise"]) | ||||
|     def test_parametrize_misspelling(self, testdir, attr): | ||||
|         """#463""" | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|             import pytest | ||||
|  | @ -1386,8 +1393,9 @@ class TestMetafuncFunctionalAuto(object): | |||
|         assert output.count("preparing foo-3") == 1 | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.issue(308) | ||||
| class TestMarkersWithParametrization(object): | ||||
|     """#308""" | ||||
| 
 | ||||
|     def test_simple_mark(self, testdir): | ||||
|         s = """ | ||||
|             import pytest | ||||
|  | @ -1575,8 +1583,8 @@ class TestMarkersWithParametrization(object): | |||
|         reprec = testdir.inline_run(SHOW_PYTEST_WARNINGS_ARG) | ||||
|         reprec.assertoutcome(passed=2, skipped=2) | ||||
| 
 | ||||
|     @pytest.mark.issue(290) | ||||
|     def test_parametrize_ID_generation_string_int_works(self, testdir): | ||||
|         """#290""" | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|             import pytest | ||||
|  |  | |||
|  | @ -605,8 +605,8 @@ class TestCaptureFixture(object): | |||
|         result.stdout.fnmatch_lines(["*KeyboardInterrupt*"]) | ||||
|         assert result.ret == 2 | ||||
| 
 | ||||
|     @pytest.mark.issue(14) | ||||
|     def test_capture_and_logging(self, testdir): | ||||
|         """#14""" | ||||
|         p = testdir.makepyfile( | ||||
|             """\ | ||||
|             import logging | ||||
|  |  | |||
|  | @ -491,10 +491,10 @@ class TestConftestVisibility(object): | |||
|             ("snc", ".", 1), | ||||
|         ], | ||||
|     ) | ||||
|     @pytest.mark.issue(616) | ||||
|     def test_parsefactories_relative_node_ids( | ||||
|         self, testdir, chdir, testarg, expect_ntests_passed | ||||
|     ): | ||||
|         """#616""" | ||||
|         dirs = self._setup_tree(testdir) | ||||
|         print("pytest run in cwd: %s" % (dirs[chdir].relto(testdir.tmpdir))) | ||||
|         print("pytestarg        : %s" % (testarg)) | ||||
|  |  | |||
|  | @ -44,11 +44,11 @@ class TestMark(object): | |||
|         class SomeClass(object): | ||||
|             pass | ||||
| 
 | ||||
|         assert pytest.mark.fun(some_function) is some_function | ||||
|         assert pytest.mark.fun.with_args(some_function) is not some_function | ||||
|         assert pytest.mark.foo(some_function) is some_function | ||||
|         assert pytest.mark.foo.with_args(some_function) is not some_function | ||||
| 
 | ||||
|         assert pytest.mark.fun(SomeClass) is SomeClass | ||||
|         assert pytest.mark.fun.with_args(SomeClass) is not SomeClass | ||||
|         assert pytest.mark.foo(SomeClass) is SomeClass | ||||
|         assert pytest.mark.foo.with_args(SomeClass) is not SomeClass | ||||
| 
 | ||||
|     def test_pytest_mark_name_starts_with_underscore(self): | ||||
|         mark = Mark() | ||||
|  | @ -130,7 +130,7 @@ def test_ini_markers_whitespace(testdir): | |||
|             assert True | ||||
|     """ | ||||
|     ) | ||||
|     rec = testdir.inline_run("--strict", "-m", "a1") | ||||
|     rec = testdir.inline_run("--strict-markers", "-m", "a1") | ||||
|     rec.assertoutcome(passed=1) | ||||
| 
 | ||||
| 
 | ||||
|  | @ -150,7 +150,7 @@ def test_marker_without_description(testdir): | |||
|     ) | ||||
|     ftdir = testdir.mkdir("ft1_dummy") | ||||
|     testdir.tmpdir.join("conftest.py").move(ftdir.join("conftest.py")) | ||||
|     rec = testdir.runpytest("--strict") | ||||
|     rec = testdir.runpytest("--strict-markers") | ||||
|     rec.assert_outcomes() | ||||
| 
 | ||||
| 
 | ||||
|  | @ -194,7 +194,8 @@ def test_mark_on_pseudo_function(testdir): | |||
|     reprec.assertoutcome(passed=1) | ||||
| 
 | ||||
| 
 | ||||
| def test_strict_prohibits_unregistered_markers(testdir): | ||||
| @pytest.mark.parametrize("option_name", ["--strict-markers", "--strict"]) | ||||
| def test_strict_prohibits_unregistered_markers(testdir, option_name): | ||||
|     testdir.makepyfile( | ||||
|         """ | ||||
|         import pytest | ||||
|  | @ -203,9 +204,11 @@ def test_strict_prohibits_unregistered_markers(testdir): | |||
|             pass | ||||
|     """ | ||||
|     ) | ||||
|     result = testdir.runpytest("--strict") | ||||
|     result = testdir.runpytest(option_name) | ||||
|     assert result.ret != 0 | ||||
|     result.stdout.fnmatch_lines(["'unregisteredmark' is not a registered marker"]) | ||||
|     result.stdout.fnmatch_lines( | ||||
|         ["'unregisteredmark' not found in `markers` configuration option"] | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.parametrize( | ||||
|  | @ -449,8 +452,8 @@ class TestFunctional(object): | |||
|         items, rec = testdir.inline_genitems(p) | ||||
|         self.assert_markers(items, test_foo=("a", "b"), test_bar=("a",)) | ||||
| 
 | ||||
|     @pytest.mark.issue(568) | ||||
|     def test_mark_should_not_pass_to_siebling_class(self, testdir): | ||||
|         """#568""" | ||||
|         p = testdir.makepyfile( | ||||
|             """ | ||||
|             import pytest | ||||
|  | @ -652,9 +655,9 @@ class TestFunctional(object): | |||
|             markers = {m.name for m in items[name].iter_markers()} | ||||
|             assert markers == set(expected_markers) | ||||
| 
 | ||||
|     @pytest.mark.issue(1540) | ||||
|     @pytest.mark.filterwarnings("ignore") | ||||
|     def test_mark_from_parameters(self, testdir): | ||||
|         """#1540""" | ||||
|         testdir.makepyfile( | ||||
|             """ | ||||
|             import pytest | ||||
|  | @ -933,16 +936,16 @@ def test_mark_expressions_no_smear(testdir): | |||
| 
 | ||||
| def test_addmarker_order(): | ||||
|     node = Node("Test", config=mock.Mock(), session=mock.Mock(), nodeid="Test") | ||||
|     node.add_marker("a") | ||||
|     node.add_marker("b") | ||||
|     node.add_marker("c", append=False) | ||||
|     node.add_marker("foo") | ||||
|     node.add_marker("bar") | ||||
|     node.add_marker("baz", append=False) | ||||
|     extracted = [x.name for x in node.iter_markers()] | ||||
|     assert extracted == ["c", "a", "b"] | ||||
|     assert extracted == ["baz", "foo", "bar"] | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.issue("https://github.com/pytest-dev/pytest/issues/3605") | ||||
| @pytest.mark.filterwarnings("ignore") | ||||
| def test_markers_from_parametrize(testdir): | ||||
|     """#3605""" | ||||
|     testdir.makepyfile( | ||||
|         """ | ||||
|         from __future__ import print_function | ||||
|  |  | |||
|  | @ -47,8 +47,8 @@ class TestWarningsRecorderChecker(object): | |||
|             assert values is rec.list | ||||
|             pytest.raises(AssertionError, rec.pop) | ||||
| 
 | ||||
|     @pytest.mark.issue(4243) | ||||
|     def test_warn_stacklevel(self): | ||||
|         """#4243""" | ||||
|         rec = WarningsRecorder() | ||||
|         with rec: | ||||
|             warnings.warn("test", DeprecationWarning, 2) | ||||
|  |  | |||
|  | @ -76,7 +76,7 @@ def broken_testdir(testdir): | |||
| 
 | ||||
| 
 | ||||
| def test_run_without_stepwise(stepwise_testdir): | ||||
|     result = stepwise_testdir.runpytest("-v", "--strict", "--fail") | ||||
|     result = stepwise_testdir.runpytest("-v", "--strict-markers", "--fail") | ||||
| 
 | ||||
|     result.stdout.fnmatch_lines(["*test_success_before_fail PASSED*"]) | ||||
|     result.stdout.fnmatch_lines(["*test_fail_on_flag FAILED*"]) | ||||
|  | @ -85,7 +85,9 @@ def test_run_without_stepwise(stepwise_testdir): | |||
| 
 | ||||
| def test_fail_and_continue_with_stepwise(stepwise_testdir): | ||||
|     # Run the tests with a failing second test. | ||||
|     result = stepwise_testdir.runpytest("-v", "--strict", "--stepwise", "--fail") | ||||
|     result = stepwise_testdir.runpytest( | ||||
|         "-v", "--strict-markers", "--stepwise", "--fail" | ||||
|     ) | ||||
|     assert not result.stderr.str() | ||||
| 
 | ||||
|     stdout = result.stdout.str() | ||||
|  | @ -95,7 +97,7 @@ def test_fail_and_continue_with_stepwise(stepwise_testdir): | |||
|     assert "test_success_after_fail" not in stdout | ||||
| 
 | ||||
|     # "Fix" the test that failed in the last run and run it again. | ||||
|     result = stepwise_testdir.runpytest("-v", "--strict", "--stepwise") | ||||
|     result = stepwise_testdir.runpytest("-v", "--strict-markers", "--stepwise") | ||||
|     assert not result.stderr.str() | ||||
| 
 | ||||
|     stdout = result.stdout.str() | ||||
|  | @ -107,7 +109,12 @@ def test_fail_and_continue_with_stepwise(stepwise_testdir): | |||
| 
 | ||||
| def test_run_with_skip_option(stepwise_testdir): | ||||
|     result = stepwise_testdir.runpytest( | ||||
|         "-v", "--strict", "--stepwise", "--stepwise-skip", "--fail", "--fail-last" | ||||
|         "-v", | ||||
|         "--strict-markers", | ||||
|         "--stepwise", | ||||
|         "--stepwise-skip", | ||||
|         "--fail", | ||||
|         "--fail-last", | ||||
|     ) | ||||
|     assert not result.stderr.str() | ||||
| 
 | ||||
|  | @ -120,7 +127,7 @@ def test_run_with_skip_option(stepwise_testdir): | |||
| 
 | ||||
| 
 | ||||
| def test_fail_on_errors(error_testdir): | ||||
|     result = error_testdir.runpytest("-v", "--strict", "--stepwise") | ||||
|     result = error_testdir.runpytest("-v", "--strict-markers", "--stepwise") | ||||
| 
 | ||||
|     assert not result.stderr.str() | ||||
|     stdout = result.stdout.str() | ||||
|  | @ -131,7 +138,7 @@ def test_fail_on_errors(error_testdir): | |||
| 
 | ||||
| def test_change_testfile(stepwise_testdir): | ||||
|     result = stepwise_testdir.runpytest( | ||||
|         "-v", "--strict", "--stepwise", "--fail", "test_a.py" | ||||
|         "-v", "--strict-markers", "--stepwise", "--fail", "test_a.py" | ||||
|     ) | ||||
|     assert not result.stderr.str() | ||||
| 
 | ||||
|  | @ -140,7 +147,9 @@ def test_change_testfile(stepwise_testdir): | |||
| 
 | ||||
|     # Make sure the second test run starts from the beginning, since the | ||||
|     # test to continue from does not exist in testfile_b. | ||||
|     result = stepwise_testdir.runpytest("-v", "--strict", "--stepwise", "test_b.py") | ||||
|     result = stepwise_testdir.runpytest( | ||||
|         "-v", "--strict-markers", "--stepwise", "test_b.py" | ||||
|     ) | ||||
|     assert not result.stderr.str() | ||||
| 
 | ||||
|     stdout = result.stdout.str() | ||||
|  | @ -149,7 +158,11 @@ def test_change_testfile(stepwise_testdir): | |||
| 
 | ||||
| def test_stop_on_collection_errors(broken_testdir): | ||||
|     result = broken_testdir.runpytest( | ||||
|         "-v", "--strict", "--stepwise", "working_testfile.py", "broken_testfile.py" | ||||
|         "-v", | ||||
|         "--strict-markers", | ||||
|         "--stepwise", | ||||
|         "working_testfile.py", | ||||
|         "broken_testfile.py", | ||||
|     ) | ||||
| 
 | ||||
|     stdout = result.stdout.str() | ||||
|  |  | |||
|  | @ -58,8 +58,8 @@ class TestTempdirHandler(object): | |||
|         assert tmp2.relto(t.getbasetemp()).startswith("this") | ||||
|         assert tmp2 != tmp | ||||
| 
 | ||||
|     @pytest.mark.issue(4425) | ||||
|     def test_tmppath_relative_basetemp_absolute(self, tmp_path, monkeypatch): | ||||
|         """#4425""" | ||||
|         from _pytest.tmpdir import TempPathFactory | ||||
| 
 | ||||
|         monkeypatch.chdir(tmp_path) | ||||
|  |  | |||
|  | @ -930,11 +930,11 @@ def test_class_method_containing_test_issue1558(testdir): | |||
|     reprec.assertoutcome(passed=1) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.issue(3498) | ||||
| @pytest.mark.parametrize( | ||||
|     "base", ["six.moves.builtins.object", "unittest.TestCase", "unittest2.TestCase"] | ||||
| ) | ||||
| def test_usefixtures_marker_on_unittest(base, testdir): | ||||
|     """#3498""" | ||||
|     module = base.rsplit(".", 1)[0] | ||||
|     pytest.importorskip(module) | ||||
|     testdir.makepyfile( | ||||
|  |  | |||
|  | @ -302,7 +302,7 @@ def test_filterwarnings_mark_registration(testdir): | |||
|             pass | ||||
|     """ | ||||
|     ) | ||||
|     result = testdir.runpytest("--strict") | ||||
|     result = testdir.runpytest("--strict-markers") | ||||
|     assert result.ret == 0 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										8
									
								
								tox.ini
								
								
								
								
							
							
						
						
									
										8
									
								
								tox.ini
								
								
								
								
							|  | @ -139,7 +139,7 @@ commands = python scripts/release.py {posargs} | |||
| 
 | ||||
| [pytest] | ||||
| minversion = 2.0 | ||||
| addopts = -ra -p pytester | ||||
| addopts = -ra -p pytester --strict-markers | ||||
| rsyncdirs = tox.ini doc src testing | ||||
| python_files = test_*.py *_test.py testing/*/*.py | ||||
| python_classes = Test Acceptance | ||||
|  | @ -170,7 +170,11 @@ filterwarnings = | |||
|     ignore::_pytest.warning_types.PytestUnknownMarkWarning | ||||
| pytester_example_dir = testing/example_scripts | ||||
| markers = | ||||
|     issue | ||||
|     # dummy markers for testing | ||||
|     foo | ||||
|     bar | ||||
|     baz | ||||
|     # conftest.py reorders tests moving slow ones to the end of the list | ||||
|     slow | ||||
| 
 | ||||
| [flake8] | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue