如果安装了pytest-xdist,如何通过pytest -nauto启用并行性?

时间:2019-01-04 15:57:41

标签: python pytest xdist

要启用并行测试,必须安装pytest-xdist并将-nauto选项传递给pytest才能使用所有可用的CPU。我想默认启用-nauto,但仍将pytest-xdist设为可选。所以这行不通:

[pytest]
addopts = -nauto

如果安装了pytest-xdist,是否可以默认启用pytest并行性? (如果需要,也可以使用pytest -n0再次将其禁用。)

我猜想必须写某种conftest.py钩子吗?是possible来检测已安装的插件,但是pytest_configure是在加载插件后运行的,这可能为时已晚。此外,我不确定此时如何添加选项(或如何配置直接操作xdist)。

1 个答案:

答案 0 :(得分:1)

您可以检查xdist选项组是否定义了numprocesses arg。这表示已安装pytest-xdist,并将处理该选件。如果不是这种情况,您自己的虚拟arg将确保pytest知道该选项(并安全地忽略):

# 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"
    )

现在,即使未安装pytest.ini,也可以将选项保留在pytest-xdist中。但是,您将需要使用long选项:

[pytest]
addopts=--numprocesses=auto

这样做的原因是短选项是为pytest保留的,因此上面的代码未定义或使用它。如果您确实需要short选项,则必须诉诸private方法:

parser.getgroup('xdist')._addoption('-n', '--numprocesses', dest='numprocesses', ...)

现在您可以在配置中使用short选项:

[pytest]
addopts=-nauto