Как включить параллелизм с помощью pytest -nauto, если установлен pytest-xdist?

Чтобы включить параллельные тесты, нужно установить pytest-xdist и использовать передать -nauto возможность pytest использовать все доступные процессоры. Я хотел бы включить -nauto по умолчанию, но все равно сделать pytest-xdist необязательный. Так что это не будет работать:

[pytest]
addopts = -nauto

Есть ли способ включить параллельный параллелизм по умолчанию, если pytest-xdist установлено? (Также должно быть возможно отключить его снова с помощью pytest -n0 при желании.)

Я думаю, что какой-то conftest.py крючок должен быть написан? Можно обнаружить установленные плагины, но pytest_configure запускается после загрузки плагинов, что может быть слишком поздно. Кроме того, я не уверен, как опции могут быть добавлены в этот момент (или как настроить напрямую манипулировать xdist).

1 ответ

Решение

Вы можете проверить, является ли xdist группа опций имеет numprocesses Аргумент определен. Это указывает на то, что pytest-xdist установлен и опция будет обработана. Если это не так, ваш собственный фиктивный аргумент гарантирует, что опция известна 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 не установлен; тем не менее, вам нужно будет использовать длинную опцию:

[pytest]
addopts=--numprocesses=auto

Причина в том, что короткие варианты зарезервированы для pytest сам по себе, поэтому приведенный выше код не определяет и не использует его. Если вам действительно нужен короткий вариант, вы должны прибегнуть к закрытому методу:

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

Теперь вы можете использовать короткий параметр в конфигурации:

[pytest]
addopts=-nauto
Другие вопросы по тегам