diff --git a/src/_pytest/nodes.py b/src/_pytest/nodes.py index ef74c53eba4..672f5b01dba 100644 --- a/src/_pytest/nodes.py +++ b/src/_pytest/nodes.py @@ -173,10 +173,12 @@ def listchain(self): chain.reverse() return chain - def add_marker(self, marker): + def add_marker(self, marker, append=True): """dynamically add a marker object to the node. :type marker: str or pytest.mark.* + ``append=True`` whether to append the marker, + if false insert at position 0 """ from _pytest.mark import MarkDecorator, MARK_GEN @@ -185,7 +187,10 @@ def add_marker(self, marker): elif not isinstance(marker, MarkDecorator): raise ValueError("is not a string or pytest.mark.* Marker") self.keywords[marker.name] = marker - self.own_markers.append(marker.mark) + if append: + self.own_markers.append(marker.mark) + else: + self.own_markers.insert(0, marker.mark) def iter_markers(self, name=None): """ diff --git a/testing/test_mark.py b/testing/test_mark.py index e2e7369dc79..dd1f8a1a448 100644 --- a/testing/test_mark.py +++ b/testing/test_mark.py @@ -1132,3 +1132,12 @@ def test_addmarker_getmarker(): node.add_marker("b") node.get_marker("a").combined node.get_marker("b").combined + + +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) + extracted = [x.name for x in node.iter_markers()] + assert extracted == ["c", "a", "b"]