From 675473edab875778c717d7e5ac61d657cd193219 Mon Sep 17 00:00:00 2001 From: AleksZyro <178569539+AleksZyro@users.noreply.github.com> Date: Mon, 13 Jul 2026 12:17:29 +0200 Subject: [PATCH] Preserve missing path error with xdist --- changelog/109.bugfix.rst | 1 + src/xdist/plugin.py | 29 +++++++++++++++++++++++++---- testing/acceptance_test.py | 10 ++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 changelog/109.bugfix.rst diff --git a/changelog/109.bugfix.rst b/changelog/109.bugfix.rst new file mode 100644 index 00000000..bd2c16b6 --- /dev/null +++ b/changelog/109.bugfix.rst @@ -0,0 +1 @@ +Preserve pytest's missing path error when using distributed mode. diff --git a/src/xdist/plugin.py b/src/xdist/plugin.py index 7dcdcdbb..a63bd026 100644 --- a/src/xdist/plugin.py +++ b/src/xdist/plugin.py @@ -1,5 +1,6 @@ from __future__ import annotations +import inspect import math import os import sys @@ -419,6 +420,24 @@ def _is_distribution_mode(config: pytest.Config) -> bool: return config.getoption("dist") != "no" and bool(config.getoption("tx")) +def _validate_collection_args(config: pytest.Config) -> None: + """Raise pytest's normal UsageError for invalid collection arguments.""" + from _pytest.main import resolve_collection_argument + + parameters = inspect.signature(resolve_collection_argument).parameters + kwargs: dict[str, object] = {"as_pypath": config.option.pyargs} + if "consider_namespace_packages" in parameters: + kwargs["consider_namespace_packages"] = config.getini( + "consider_namespace_packages" + ) + + for arg_index, arg in enumerate(config.args): + args: list[object] = [config.invocation_params.dir, arg] + if "arg_index" in parameters: + args.append(arg_index) + resolve_collection_argument(*args, **kwargs) + + @pytest.hookimpl(tryfirst=True) def pytest_cmdline_main(config: pytest.Config) -> None: if config.option.distload: @@ -446,10 +465,12 @@ def pytest_cmdline_main(config: pytest.Config) -> None: config.option.tx = [] val = config.getvalue - if not val("collectonly") and _is_distribution_mode(config) and usepdb: - raise pytest.UsageError( - "--pdb is incompatible with distributing tests; try using -n0 or -nauto." - ) + if not val("collectonly") and _is_distribution_mode(config): + if usepdb: + raise pytest.UsageError( + "--pdb is incompatible with distributing tests; try using -n0 or -nauto." + ) + _validate_collection_args(config) # ------------------------------------------------------------------------- diff --git a/testing/acceptance_test.py b/testing/acceptance_test.py index 814c8c09..7a0a9349 100644 --- a/testing/acceptance_test.py +++ b/testing/acceptance_test.py @@ -388,6 +388,16 @@ def test_ok(): assert result.ret == 0 result.stdout.fnmatch_lines(["*collected 1 item*"]) + def test_dist_with_missing_path_reports_usage_error( + self, pytester: pytest.Pytester + ) -> None: + result = pytester.runpytest("missing_path", "-n2") + + assert result.ret != 0 + result.stderr.fnmatch_lines( + ["ERROR: file or directory not found: missing_path"] + ) + class TestDistEach: def test_simple(self, pytester: pytest.Pytester) -> None: