fix addmarker - extract mark from markdecorator

This commit is contained in:
Ronny Pfannschmidt 2018-06-12 14:49:54 +02:00
parent 1b5322da1b
commit 37793d4cdb
4 changed files with 23 additions and 4 deletions

View File

@ -0,0 +1 @@
Fix regression in Node.add_marker by extracting the mark object of a markdecorator.

View File

@ -281,7 +281,14 @@ def _marked(func, mark):
class MarkInfo(object): class MarkInfo(object):
""" Marking object created by :class:`MarkDecorator` instances. """ """ Marking object created by :class:`MarkDecorator` instances. """
_marks = attr.ib() _marks = attr.ib(convert=list)
@_marks.validator
def validate_marks(self, attribute, value):
for item in value:
if not isinstance(item, Mark):
raise ValueError(item)
combined = attr.ib( combined = attr.ib(
repr=False, repr=False,
default=attr.Factory( default=attr.Factory(

View File

@ -173,10 +173,12 @@ class Node(object):
chain.reverse() chain.reverse()
return chain return chain
def add_marker(self, marker): def add_marker(self, marker, append=True):
""" dynamically add a marker object to the node. """ dynamically add a marker object to the node.
``marker`` can be a string or pytest.mark.* instance. ``marker`` can be a string or pytest.mark.* instance.
``append=True`` whether to append the marker,
if false insert at position 0
""" """
from _pytest.mark import MarkDecorator, MARK_GEN from _pytest.mark import MarkDecorator, MARK_GEN
@ -185,7 +187,7 @@ class Node(object):
elif not isinstance(marker, MarkDecorator): elif not isinstance(marker, MarkDecorator):
raise ValueError("is not a string or pytest.mark.* Marker") raise ValueError("is not a string or pytest.mark.* Marker")
self.keywords[marker.name] = marker self.keywords[marker.name] = marker
self.own_markers.append(marker) self.own_markers.append(marker.mark)
def iter_markers(self, name=None): def iter_markers(self, name=None):
""" """

View File

@ -1,7 +1,7 @@
from __future__ import absolute_import, division, print_function from __future__ import absolute_import, division, print_function
import os import os
import sys import sys
import mock
import pytest import pytest
from _pytest.mark import ( from _pytest.mark import (
MarkGenerator as Mark, MarkGenerator as Mark,
@ -9,6 +9,7 @@ from _pytest.mark import (
transfer_markers, transfer_markers,
EMPTY_PARAMETERSET_OPTION, EMPTY_PARAMETERSET_OPTION,
) )
from _pytest.nodes import Node
ignore_markinfo = pytest.mark.filterwarnings( ignore_markinfo = pytest.mark.filterwarnings(
"ignore:MarkInfo objects:_pytest.deprecated.RemovedInPytest4Warning" "ignore:MarkInfo objects:_pytest.deprecated.RemovedInPytest4Warning"
@ -1123,3 +1124,11 @@ def test_mark_expressions_no_smear(testdir):
passed_k, skipped_k, failed_k = reprec_keywords.countoutcomes() passed_k, skipped_k, failed_k = reprec_keywords.countoutcomes()
assert passed_k == 2 assert passed_k == 2
assert skipped_k == failed_k == 0 assert skipped_k == failed_k == 0
def test_addmarker_getmarker():
node = Node("Test", config=mock.Mock(), session=mock.Mock(), nodeid="Test")
node.add_marker(pytest.mark.a(1))
node.add_marker("b")
node.get_marker("a").combined
node.get_marker("b").combined