-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Fix test collection from packages mixed with directories. #3768 and #3789 #3802
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
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@@ -216,18 +216,6 @@ def pytest_pycollect_makemodule(path, parent): | |||
return Module(path, parent) | |||
|
|||
|
|||
def pytest_ignore_collect(path, config): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah this does not really seem necessary, main.pytest_ignore_collect
already seems to do the exactly same thing anyway.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Initially I copy/pasted the Package class from Session because they both serve very similar functions, and then realized not everything was needed.
@@ -594,6 +580,15 @@ def isinitpath(self, path): | |||
return path in self.session._initialpaths | |||
|
|||
def collect(self): | |||
# XXX: HACK! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Strange, I expect main.pytest_ignore_collect
to handle this properly already:
Lines 261 to 284 in 4d8903f
def pytest_ignore_collect(path, config): | |
ignore_paths = config._getconftest_pathlist("collect_ignore", path=path.dirpath()) | |
ignore_paths = ignore_paths or [] | |
excludeopt = config.getoption("ignore") | |
if excludeopt: | |
ignore_paths.extend([py.path.local(x) for x in excludeopt]) | |
if py.path.local(path) in ignore_paths: | |
return True | |
allow_in_venv = config.getoption("collect_in_virtualenv") | |
if _in_venv(path) and not allow_in_venv: | |
return True | |
# Skip duplicate paths. | |
keepduplicates = config.getoption("keepduplicates") | |
duplicate_paths = config.pluginmanager._duplicatepaths | |
if not keepduplicates: | |
if path in duplicate_paths: | |
return True | |
else: | |
duplicate_paths.add(path) | |
return False |
If pytest_ignore_collect
sees the same path twice, it should ignore the collection when see the path the second time, which would not trigger a new Package
item to be collected.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The problem is it sees that some modules were already "collected" (at Session level) via the recurse() method. Then when the package goes and tries to collect its children and turn them into nodes it can't because they look like duplicates. Wrong! My first reaction was to try to stop marking them as duplicates at Session level, but everything is so tangled up that I can't find a cleaner way.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
JFI: I've moved it in #4241.
|
||
|
||
def test_package_with_modules(testdir): | ||
""" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just FYI, you could have created the actual files in testing/example_scripts
and copied the whole directory here like the code above this function does.
The idea is that it is easier to execute the test using pytest as normal during testing/debugging. 😉
This is fine as is, just thought I would mention this for the future. 👍
LGTM! Took the liberty of committing the missing changelog entries. 👍 |
This removes the hack added in pytest-dev#3802.
This removes the hack added in pytest-dev#3802. Adjusts test: - it appears to not have been changed to 7 intentionally. - removes XXX comment, likely not relevant anymore since 6dac774.
This removes the hack added in pytest-dev#3802. Adjusts test: - it appears to not have been changed to 7 intentionally. - removes XXX comment, likely not relevant anymore since 6dac774. Backport of e041823 (pytest-dev#4241) from features.
This removes the hack added in pytest-dev#3802. Adjusts test: - it appears to not have been changed to 7 intentionally. - removes XXX comment, likely not relevant anymore since 6dac774. Backport of e041823 (pytest-dev#4241) from features.
This removes the hack added in pytest-dev#3802. Adjusts test: - it appears to not have been changed to 7 intentionally. - removes XXX comment, likely not relevant anymore since 6dac774. Backport of e041823 (pytest-dev#4241) from features.
The 3.7.x releases seem to suffer from a regression in tests collection that affects our linting process. It may have been fixed upstream already [1]. Freezing requirement to latest 3.6.x for now. [1] pytest-dev/pytest#3802
This should fix the issue but I still can't find a better fix. See the comment in the code.
What happens is: the files and directories are marked as duplicates when the Session starts collection even though they're not turned into nodes right away (the package nodes will do that later). Ideally is that when Session finds a Package it should stop recursing and move on.