130 lines
3.4 KiB
Python
130 lines
3.4 KiB
Python
"""
|
|
xdist hooks.
|
|
|
|
Additionally, pytest-xdist will also decorate a few other hooks
|
|
with the worker instance that executed the hook originally:
|
|
|
|
``pytest_runtest_logreport``: ``rep`` parameter has a ``node`` attribute.
|
|
|
|
You can use this hooks just as you would use normal pytest hooks, but some care
|
|
must be taken in plugins in case ``xdist`` is not installed. Please see:
|
|
|
|
http://pytest.org/en/latest/writing_plugins.html#optionally-using-hooks-from-3rd-party-plugins
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
from typing import Any
|
|
from typing import Sequence
|
|
from typing import TYPE_CHECKING
|
|
|
|
import execnet
|
|
import pytest
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
from xdist.remote import Producer
|
|
from xdist.scheduler.protocol import Scheduling
|
|
from xdist.workermanage import WorkerController
|
|
|
|
|
|
@pytest.hookspec()
|
|
def pytest_xdist_setupnodes(
|
|
config: pytest.Config, specs: Sequence[execnet.XSpec]
|
|
) -> None:
|
|
"""Called before any remote node is set up."""
|
|
|
|
|
|
@pytest.hookspec()
|
|
def pytest_xdist_newgateway(gateway: execnet.Gateway) -> None:
|
|
"""Called on new raw gateway creation."""
|
|
|
|
|
|
@pytest.hookspec(
|
|
warn_on_impl=DeprecationWarning(
|
|
"rsync feature is deprecated and will be removed in pytest-xdist 4.0"
|
|
)
|
|
)
|
|
def pytest_xdist_rsyncstart(
|
|
source: str | os.PathLike[str],
|
|
gateways: Sequence[execnet.Gateway],
|
|
) -> None:
|
|
"""Called before rsyncing a directory to remote gateways takes place."""
|
|
|
|
|
|
@pytest.hookspec(
|
|
warn_on_impl=DeprecationWarning(
|
|
"rsync feature is deprecated and will be removed in pytest-xdist 4.0"
|
|
)
|
|
)
|
|
def pytest_xdist_rsyncfinish(
|
|
source: str | os.PathLike[str],
|
|
gateways: Sequence[execnet.Gateway],
|
|
) -> None:
|
|
"""Called after rsyncing a directory to remote gateways takes place."""
|
|
|
|
|
|
@pytest.hookspec(firstresult=True)
|
|
def pytest_xdist_getremotemodule() -> Any:
|
|
"""Called when creating remote node."""
|
|
|
|
|
|
@pytest.hookspec()
|
|
def pytest_configure_node(node: WorkerController) -> None:
|
|
"""Configure node information before it gets instantiated."""
|
|
|
|
|
|
@pytest.hookspec()
|
|
def pytest_testnodeready(node: WorkerController) -> None:
|
|
"""Test Node is ready to operate."""
|
|
|
|
|
|
@pytest.hookspec()
|
|
def pytest_testnodedown(node: WorkerController, error: object | None) -> None:
|
|
"""Test Node is down."""
|
|
|
|
|
|
@pytest.hookspec()
|
|
def pytest_xdist_node_collection_finished(
|
|
node: WorkerController, ids: Sequence[str]
|
|
) -> None:
|
|
"""Called by the controller node when a worker node finishes collecting."""
|
|
|
|
|
|
@pytest.hookspec(firstresult=True)
|
|
def pytest_xdist_make_scheduler(
|
|
config: pytest.Config, log: Producer
|
|
) -> Scheduling | None:
|
|
"""Return a node scheduler implementation."""
|
|
|
|
|
|
@pytest.hookspec(firstresult=True)
|
|
def pytest_xdist_auto_num_workers(config: pytest.Config) -> int:
|
|
"""
|
|
Return the number of workers to spawn when ``--numprocesses=auto`` is given in the
|
|
command-line.
|
|
|
|
.. versionadded:: 2.1
|
|
"""
|
|
raise NotImplementedError()
|
|
|
|
|
|
@pytest.hookspec(firstresult=True)
|
|
def pytest_handlecrashitem(
|
|
crashitem: str, report: pytest.TestReport, sched: Scheduling
|
|
) -> None:
|
|
"""
|
|
Handle a crashitem, modifying the report if necessary.
|
|
|
|
The scheduler is provided as a parameter to reschedule the test if desired with
|
|
`sched.mark_test_pending`.
|
|
|
|
def pytest_handlecrashitem(crashitem, report, sched):
|
|
if should_rerun(crashitem):
|
|
sched.mark_test_pending(crashitem)
|
|
report.outcome = "rerun"
|
|
|
|
.. versionadded:: 2.2.1
|
|
"""
|