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. Вы можете улучшить это решение в соответствии со своими потребностями.