2014-11-19 4 views
9

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

+0

Здесь есть открытая проблема: https://github.com/pytest-dev/pytest/issues/680 –

+1

woohoo, pytest xdist теперь отличает опцию '-s'! См. Выше выпуск. –

ответ

0

Я использовал последовавшей код:

# 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».

+0

Хм, похоже, это не работает для меня. У меня есть инструкции 'print' в моих установках, которые определенно выполняются, но я не вижу их результатов в тестовом прогоне. –

1

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

sys.stdout = sys.stderr 

При размещении в conftest.py применяется ко всем испытаниям.

Смежные вопросы