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

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

3 ответа

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

sys.stdout = sys.stderr

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

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

# 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" тип.

Решение Стива великолепно, но иногда мы не можем изменить общий файл conftest.py .

я использую-sаргумент команды pytest:

      pytest -s path/test_file.py

Внутри моего кода Python я использую эти строки:

      import sys
print("\nMy DEBUG line", file=sys.stderr)

pytest подскажет мне мою строку DEBUG. Вы можете улучшить это решение в соответствии со своими потребностями.

Другие вопросы по тегам