Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog/109.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Preserve pytest's missing path error when using distributed mode.
29 changes: 25 additions & 4 deletions src/xdist/plugin.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import annotations

import inspect
import math
import os
import sys
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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)


# -------------------------------------------------------------------------
Expand Down
10 changes: 10 additions & 0 deletions testing/acceptance_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down