parent
10f98e1d2f
commit
2213016e40
|
@ -0,0 +1 @@
|
||||||
|
Fix test collection when a full path without a drive letter was passed to pytest on Windows (for example ``\projects\tests\test.py`` instead of ``c:\projects\tests\pytest.py``).
|
|
@ -31,6 +31,7 @@ from _pytest.config import UsageError
|
||||||
from _pytest.config.argparsing import Parser
|
from _pytest.config.argparsing import Parser
|
||||||
from _pytest.fixtures import FixtureManager
|
from _pytest.fixtures import FixtureManager
|
||||||
from _pytest.outcomes import exit
|
from _pytest.outcomes import exit
|
||||||
|
from _pytest.pathlib import absolutepath
|
||||||
from _pytest.pathlib import Path
|
from _pytest.pathlib import Path
|
||||||
from _pytest.pathlib import visit
|
from _pytest.pathlib import visit
|
||||||
from _pytest.reports import CollectReport
|
from _pytest.reports import CollectReport
|
||||||
|
@ -693,15 +694,15 @@ class Session(nodes.FSCollector):
|
||||||
strpath, *parts = str(arg).split("::")
|
strpath, *parts = str(arg).split("::")
|
||||||
if self.config.option.pyargs:
|
if self.config.option.pyargs:
|
||||||
strpath = self._tryconvertpyarg(strpath)
|
strpath = self._tryconvertpyarg(strpath)
|
||||||
relpath = strpath.replace("/", os.sep)
|
fspath = Path(str(self.config.invocation_dir), strpath)
|
||||||
fspath = self.config.invocation_dir.join(relpath, abs=True)
|
fspath = absolutepath(fspath)
|
||||||
if not fspath.check():
|
if not fspath.exists():
|
||||||
if self.config.option.pyargs:
|
if self.config.option.pyargs:
|
||||||
raise UsageError(
|
raise UsageError(
|
||||||
"file or package not found: " + arg + " (missing __init__.py?)"
|
"file or package not found: " + arg + " (missing __init__.py?)"
|
||||||
)
|
)
|
||||||
raise UsageError("file not found: " + arg)
|
raise UsageError("file not found: " + arg)
|
||||||
return (fspath, parts)
|
return py.path.local(str(fspath)), parts
|
||||||
|
|
||||||
def matchnodes(
|
def matchnodes(
|
||||||
self, matching: Sequence[Union[nodes.Item, nodes.Collector]], names: List[str],
|
self, matching: Sequence[Union[nodes.Item, nodes.Collector]], names: List[str],
|
||||||
|
|
|
@ -1426,3 +1426,42 @@ class TestImportModeImportlib:
|
||||||
"* 1 failed in *",
|
"* 1 failed in *",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_module_full_path_without_drive(testdir):
|
||||||
|
"""Collect and run test using full path except for the drive letter (#7628)
|
||||||
|
|
||||||
|
Passing a full path without a drive letter would trigger a bug in py.path.local
|
||||||
|
where it would keep the full path without the drive letter around, instead of resolving
|
||||||
|
to the full path, resulting in fixtures node ids not matching against test node ids correctly.
|
||||||
|
"""
|
||||||
|
testdir.makepyfile(
|
||||||
|
**{
|
||||||
|
"project/conftest.py": """
|
||||||
|
import pytest
|
||||||
|
@pytest.fixture
|
||||||
|
def fix(): return 1
|
||||||
|
""",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
testdir.makepyfile(
|
||||||
|
**{
|
||||||
|
"project/tests/dummy_test.py": """
|
||||||
|
def test(fix):
|
||||||
|
assert fix == 1
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
)
|
||||||
|
fn = testdir.tmpdir.join("project/tests/dummy_test.py")
|
||||||
|
assert fn.isfile()
|
||||||
|
|
||||||
|
drive, path = os.path.splitdrive(str(fn))
|
||||||
|
|
||||||
|
result = testdir.runpytest(path, "-v")
|
||||||
|
result.stdout.fnmatch_lines(
|
||||||
|
[
|
||||||
|
os.path.join("project", "tests", "dummy_test.py") + "::test PASSED *",
|
||||||
|
"* 1 passed in *",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue