Я использую pytest с pytest-xdist для параллельного тестирования. Похоже, что он не соблюдает параметр -s
для прохождения через стандартный вывод на терминал по мере запуска тестов. Есть ли способ сделать это возможным? Я понимаю, что это может привести к тому, что выходные данные из разных процессов будут перемешаны в терминале, но я в порядке с этим.
Pytest + xdist без захвата вывода?
Ответ 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
".