Merge pull request #7046 from blueyed/k-skip-session-upstream

This commit is contained in:
Bruno Oliveira 2020-05-19 20:09:36 -03:00 committed by GitHub
commit 0a03217903
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 9 deletions

View File

@ -0,0 +1,6 @@
``-k`` no longer matches against the names of the directories outside the test session root.
Also, ``pytest.Package.name`` is now just the name of the directory containing the package's
``__init__.py`` file, instead of the full path. This is consistent with how the other nodes
are named, and also one of the reasons why ``-k`` would match against any directory containing
the test suite.

View File

@ -136,7 +136,7 @@ class KeywordMatcher:
import pytest
for item in item.listchain():
if not isinstance(item, pytest.Instance):
if not isinstance(item, (pytest.Instance, pytest.Session)):
mapped_names.add(item.name)
# Add the names added as extra keywords to current or parent items

View File

@ -571,8 +571,7 @@ class Package(Module):
nodes.FSCollector.__init__(
self, fspath, parent=parent, config=config, session=session, nodeid=nodeid
)
self.name = fspath.dirname
self.name = os.path.basename(str(fspath.dirname))
def setup(self):
# not using fixtures to call setup_module here because autouse fixtures

View File

@ -1004,7 +1004,7 @@ def test_collect_init_tests(testdir):
result.stdout.fnmatch_lines(
[
"collected 2 items",
"<Package *",
"<Package tests>",
" <Module __init__.py>",
" <Function test_init>",
" <Module test_foo.py>",
@ -1015,7 +1015,7 @@ def test_collect_init_tests(testdir):
result.stdout.fnmatch_lines(
[
"collected 2 items",
"<Package *",
"<Package tests>",
" <Module __init__.py>",
" <Function test_init>",
" <Module test_foo.py>",
@ -1027,7 +1027,7 @@ def test_collect_init_tests(testdir):
result.stdout.fnmatch_lines(
[
"collected 2 items",
"<Package */tests>",
"<Package tests>",
" <Module __init__.py>",
" <Function test_init>",
" <Module test_foo.py>",
@ -1039,7 +1039,7 @@ def test_collect_init_tests(testdir):
result.stdout.fnmatch_lines(
[
"collected 2 items",
"<Package */tests>",
"<Package tests>",
" <Module __init__.py>",
" <Function test_init>",
" <Module test_foo.py>",
@ -1048,12 +1048,12 @@ def test_collect_init_tests(testdir):
)
result = testdir.runpytest("./tests/test_foo.py", "--collect-only")
result.stdout.fnmatch_lines(
["<Package */tests>", " <Module test_foo.py>", " <Function test_foo>"]
["<Package tests>", " <Module test_foo.py>", " <Function test_foo>"]
)
result.stdout.no_fnmatch_line("*test_init*")
result = testdir.runpytest("./tests/__init__.py", "--collect-only")
result.stdout.fnmatch_lines(
["<Package */tests>", " <Module __init__.py>", " <Function test_init>"]
["<Package tests>", " <Module __init__.py>", " <Function test_init>"]
)
result.stdout.no_fnmatch_line("*test_foo*")

View File

@ -834,6 +834,36 @@ class TestKeywordSelection:
deselected_tests = dlist[0].items
assert len(deselected_tests) == 1
def test_no_match_directories_outside_the_suite(self, testdir):
"""
-k should not match against directories containing the test suite (#7040).
"""
test_contents = """
def test_aaa(): pass
def test_ddd(): pass
"""
testdir.makepyfile(
**{"ddd/tests/__init__.py": "", "ddd/tests/test_foo.py": test_contents}
)
def get_collected_names(*args):
_, rec = testdir.inline_genitems(*args)
calls = rec.getcalls("pytest_collection_finish")
assert len(calls) == 1
return [x.name for x in calls[0].session.items]
# sanity check: collect both tests in normal runs
assert get_collected_names() == ["test_aaa", "test_ddd"]
# do not collect anything based on names outside the collection tree
assert get_collected_names("-k", testdir.tmpdir.basename) == []
# "-k ddd" should only collect "test_ddd", but not
# 'test_aaa' just because one of its parent directories is named "ddd";
# this was matched previously because Package.name would contain the full path
# to the package
assert get_collected_names("-k", "ddd") == ["test_ddd"]
class TestMarkDecorator:
@pytest.mark.parametrize(