Skip to content

Commit 37793d4

Browse files
fix addmarker - extract mark from markdecorator
1 parent 1b5322d commit 37793d4

File tree

4 files changed

+23
-4
lines changed

4 files changed

+23
-4
lines changed

changelog/3555.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix regression in Node.add_marker by extracting the mark object of a markdecorator.

src/_pytest/mark/structures.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,14 @@ def _marked(func, mark):
281281
class MarkInfo(object):
282282
""" Marking object created by :class:`MarkDecorator` instances. """
283283

284-
_marks = attr.ib()
284+
_marks = attr.ib(convert=list)
285+
286+
@_marks.validator
287+
def validate_marks(self, attribute, value):
288+
for item in value:
289+
if not isinstance(item, Mark):
290+
raise ValueError(item)
291+
285292
combined = attr.ib(
286293
repr=False,
287294
default=attr.Factory(

src/_pytest/nodes.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,12 @@ def listchain(self):
173173
chain.reverse()
174174
return chain
175175

176-
def add_marker(self, marker):
176+
def add_marker(self, marker, append=True):
177177
""" dynamically add a marker object to the node.
178178
179179
``marker`` can be a string or pytest.mark.* instance.
180+
``append=True`` whether to append the marker,
181+
if false insert at position 0
180182
"""
181183
from _pytest.mark import MarkDecorator, MARK_GEN
182184

@@ -185,7 +187,7 @@ def add_marker(self, marker):
185187
elif not isinstance(marker, MarkDecorator):
186188
raise ValueError("is not a string or pytest.mark.* Marker")
187189
self.keywords[marker.name] = marker
188-
self.own_markers.append(marker)
190+
self.own_markers.append(marker.mark)
189191

190192
def iter_markers(self, name=None):
191193
"""

testing/test_mark.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
from __future__ import absolute_import, division, print_function
22
import os
33
import sys
4-
4+
import mock
55
import pytest
66
from _pytest.mark import (
77
MarkGenerator as Mark,
88
ParameterSet,
99
transfer_markers,
1010
EMPTY_PARAMETERSET_OPTION,
1111
)
12+
from _pytest.nodes import Node
1213

1314
ignore_markinfo = pytest.mark.filterwarnings(
1415
"ignore:MarkInfo objects:_pytest.deprecated.RemovedInPytest4Warning"
@@ -1123,3 +1124,11 @@ class TestBarClass(BaseTests):
11231124
passed_k, skipped_k, failed_k = reprec_keywords.countoutcomes()
11241125
assert passed_k == 2
11251126
assert skipped_k == failed_k == 0
1127+
1128+
1129+
def test_addmarker_getmarker():
1130+
node = Node("Test", config=mock.Mock(), session=mock.Mock(), nodeid="Test")
1131+
node.add_marker(pytest.mark.a(1))
1132+
node.add_marker("b")
1133+
node.get_marker("a").combined
1134+
node.get_marker("b").combined

0 commit comments

Comments
 (0)