Known limitations
pytest-xdist has some limitations that may be supported in pytest but can’t be supported in pytest-xdist.
Order and amount of test must be consistent
It is not possible to have tests that differ in order or their amount across workers.
This is especially true with pytest.mark.parametrize
, when values are produced with sets or other unordered iterables/generators.
Example:
import pytest
@pytest.mark.parametrize("param", {"a", "b"})
def test_pytest_parametrize_unordered(param):
pass
In the example above, the fact that set
are not necessarily ordered can cause different workers
to collect tests in different order, which will throw an error.
Workarounds
A solution to this is to guarantee that the parametrized values have the same order.
Some solutions:
Convert your sequence to a
list
.import pytest @pytest.mark.parametrize("param", ["a", "b"]) def test_pytest_parametrize_unordered(param): pass
Sort your sequence, guaranteeing order.
import pytest @pytest.mark.parametrize("param", sorted({"a", "b"})) def test_pytest_parametrize_unordered(param): pass
Output (stdout and stderr) from workers
The -s
/--capture=no
option is meant to disable pytest capture, so users can then see stdout and stderr output in the terminal from tests and application code in real time.
However, this option does not work with pytest-xdist
because execnet the underlying library used for communication between master and workers, does not support transferring stdout/stderr from workers.
Currently, there are no plans to support this in pytest-xdist
.
Debugging
This also means that debugging using PDB (or any other debugger that wants to use standard I/O) will not work. The --pdb
option is disabled when distributing tests with pytest-xdist
for this reason.
It is generally likely best to use pytest-xdist
to find failing tests and then debug them without distribution; however, if you need to debug from within a worker process (for example, to address failures that only happen when running tests concurrently), remote debuggers (for example, python-remote-pdb or python-web-pdb) have been reported to work for this purpose.