To enable parallel tests, one has to install pytest-xdist and use pass the -nauto option to pytest to use all available CPUs. I would like to enable -nauto by default, but still make pytest-xdist optional. So this would not work:
[pytest]
addopts = -nauto
Is there a way to enable pytest parallelism by default if pytest-xdist is installed? (It should also be possible to disable it again with pytest -n0 if desired.)
I guess that some kind of conftest.py hook has to be written? It is possible to detect installed plugins, but pytest_configure is ran after loading plugins which might be too late. Besides, I am not sure how options can be added at that point (or how to configure directly manipulate xdist).
You can check whether the xdist options group has numprocesses arg defined. This indicates that pytest-xdist is installed and the option will be handled. If this is not the case, your own dummy arg will ensure the option is known to pytest (and safely ignored):
# conftest.py
def pytest_addoption(parser):
argdests = {arg.dest for arg in parser.getgroup('xdist').options}
if 'numprocesses' not in argdests:
parser.getgroup('xdist').addoption(
'--numprocesses', dest='numprocesses', metavar='numprocesses', action='store',
help="placeholder for xdist's numprocesses arg; passed value is ignored if xdist is not installed"
)
Now you can leave the option in the pytest.ini even if pytest-xdist is not installed; however, you will need to use the long option:
[pytest]
addopts=--numprocesses=auto
The reason for that is that short options are reserved for pytest itself, so the code above doesn't define or use it. Should you really need the short option, you have to resort to the private method:
parser.getgroup('xdist')._addoption('-n', '--numprocesses', dest='numprocesses', ...)
Now you can use the short option in the config:
[pytest]
addopts=-nauto
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With