Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #3441 let mark expressions be populated from the modern marker storage #3442

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions _pytest/mark/legacy.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import attr
import keyword

from . import MarkInfo, MarkDecorator

from _pytest.config import UsageError


Expand All @@ -18,11 +16,8 @@ class MarkMapping(object):
own_mark_names = attr.ib()

@classmethod
def from_keywords(cls, keywords):
mark_names = set()
for key, value in keywords.items():
if isinstance(value, MarkInfo) or isinstance(value, MarkDecorator):
mark_names.add(key)
def from_item(cls, item):
mark_names = set(mark.name for mark in item.iter_markers())
return cls(mark_names)

def __getitem__(self, name):
Expand Down Expand Up @@ -70,7 +65,7 @@ def __getitem__(self, subname):

def matchmark(colitem, markexpr):
"""Tries to match on any marker names, attached to the given colitem."""
return eval(markexpr, {}, MarkMapping.from_keywords(colitem.keywords))
return eval(markexpr, {}, MarkMapping.from_item(colitem))


def matchkeyword(colitem, keywordexpr):
Expand Down
1 change: 1 addition & 0 deletions changelog/3441.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Also use iter_marker for discovering the marks applying for marker expressions from the cli to avoid the bad data from the legacy mark storage.
34 changes: 33 additions & 1 deletion testing/test_mark.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ def test_mark_option_custom(spec, testdir):
def pytest_collection_modifyitems(items):
for item in items:
if "interface" in item.nodeid:
item.keywords["interface"] = pytest.mark.interface
item.add_marker(pytest.mark.interface)
""")
testdir.makepyfile("""
def test_interface():
Expand Down Expand Up @@ -927,3 +927,35 @@ def test_parameterset_for_parametrize_marks(testdir, mark):
def test_parameterset_for_parametrize_bad_markname(testdir):
with pytest.raises(pytest.UsageError):
test_parameterset_for_parametrize_marks(testdir, 'bad')


def test_mark_expressions_no_smear(testdir):
testdir.makepyfile("""
import pytest

class BaseTests(object):
def test_something(self):
pass

@pytest.mark.FOO
class TestFooClass(BaseTests):
pass

@pytest.mark.BAR
class TestBarClass(BaseTests):
pass
""")

reprec = testdir.inline_run("-m", 'FOO')
passed, skipped, failed = reprec.countoutcomes()
dlist = reprec.getcalls("pytest_deselected")
assert passed == 1
assert skipped == failed == 0
deselected_tests = dlist[0].items
assert len(deselected_tests) == 1

# keywords smear - expected behaviour
reprec_keywords = testdir.inline_run("-k", 'FOO')
passed_k, skipped_k, failed_k = reprec_keywords.countoutcomes()
assert passed_k == 2
assert skipped_k == failed_k == 0