Pytest + xdist без захвата вывода?

Я использую pytest с pytest-xdist для параллельного тестирования. Похоже, что он не соблюдает параметр -s для прохождения через стандартный вывод на терминал по мере запуска тестов. Есть ли способ сделать это возможным? Я понимаю, что это может привести к тому, что выходные данные из разных процессов будут перемешаны в терминале, но я в порядке с этим.

Ответ 1

Я нашел обходное решение, хотя и не полное решение. При перенаправлении stdout на stderr выводится вывод операторов печати. Это может быть выполнено с помощью одной строки кода Python:

sys.stdout = sys.stderr

Если он помещен в файл conftest.py, он применяется ко всем тестам.

Ответ 2

Я использовал следующий код:

# conftest.py
import _pytest.capture

def get_capman(plugin_manager):
    capman_list = filter(lambda p: isinstance(p, _pytest.capture.CaptureManager), plugin_manager._plugins)
    return capman_list[0] if len(capman_list) == 1 else None


def get_xdist_slave(plugin_manager):
    # TODO: have no idea how to check isinstance "__channelexec__.SlaveInteractor"
    slave_list = filter(lambda p: hasattr(p, 'slaveid'), plugin_manager._plugins)
    return slave_list[0] if len(slave_list) == 1 else None


def is_remote_xdist_session(plugin_manager):
    return get_xdist_slave(plugin_manager) is not None


def pytest_configure(config):
    if is_remote_xdist_session(config.pluginmanager) and get_capman(config.pluginmanager) is not None:
        capman = get_capman(config.pluginmanager)
        capman._method = "no"
        capman.reset_capturings()
        capman.init_capturings()

Вставьте его в файл conftest.py

Главное, чтобы убедиться, что это удаленный сеанс, и мы должны перенастроить экземпляр CaptureManager. Там одна нерешенная проблема заключается в том, как проверить, что удаленный объект имеет тип "__channelexec__.SlaveInteractor".