diff --git a/src/_pytest/fixtures.py b/src/_pytest/fixtures.py index 464828de4..d70b2c64a 100644 --- a/src/_pytest/fixtures.py +++ b/src/_pytest/fixtures.py @@ -550,8 +550,9 @@ class FixtureRequest: source_path = frameinfo.filename source_lineno = frameinfo.lineno source_path = py.path.local(source_path) - if source_path.relto(funcitem.config.rootdir): - source_path_str = source_path.relto(funcitem.config.rootdir) + rel_source_path = source_path.relto(funcitem.config.rootdir) + if rel_source_path: + source_path_str = rel_source_path else: source_path_str = str(source_path) msg = ( diff --git a/testing/python/fixtures.py b/testing/python/fixtures.py index 8cfaae50d..d9ea5cf58 100644 --- a/testing/python/fixtures.py +++ b/testing/python/fixtures.py @@ -3662,13 +3662,30 @@ class TestParameterizedSubRequest: " test_foos.py::test_foo", "", "Requested fixture 'fix_with_param' defined in:", - "*fix.py:4", + "{}:4".format(fixfile), "Requested here:", "test_foos.py:4", "*1 failed*", ] ) + # With non-overlapping rootdir, passing tests_dir. + rootdir = testdir.mkdir("rootdir") + rootdir.chdir() + result = testdir.runpytest("--rootdir", rootdir, tests_dir) + result.stdout.fnmatch_lines( + [ + "The requested fixture has no parameter defined for test:", + " test_foos.py::test_foo", + "", + "Requested fixture 'fix_with_param' defined in:", + "{}:4".format(fixfile), + "Requested here:", + "{}:4".format(testfile), + "*1 failed*", + ] + ) + def test_pytest_fixture_setup_and_post_finalizer_hook(testdir): testdir.makeconftest(