Skip to content

Commit

Permalink
Package.name now contains only basname of the package
Browse files Browse the repository at this point in the history
Previously it contained the entire path, which made '-k' match
against any name in the full path of the package.

Fix pytest-dev#7040
  • Loading branch information
nicoddemus committed May 16, 2020
1 parent 3d3b951 commit c5b367b
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 9 deletions.
6 changes: 6 additions & 0 deletions changelog/7040.breaking.rst
Original file line number Diff line number Diff line change
@@ -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.
1 change: 0 additions & 1 deletion changelog/7040.improvement.rst

This file was deleted.

3 changes: 1 addition & 2 deletions src/_pytest/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -568,8 +568,7 @@ def __init__(
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
Expand Down
12 changes: 6 additions & 6 deletions testing/test_collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -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>",
Expand All @@ -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>",
Expand All @@ -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>",
Expand All @@ -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>",
Expand All @@ -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*")

Expand Down
30 changes: 30 additions & 0 deletions testing/test_mark.py
Original file line number Diff line number Diff line change
Expand Up @@ -834,6 +834,36 @@ def test_one(): assert 1
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(
Expand Down

0 comments on commit c5b367b

Please sign in to comment.