pytest + xdist没有捕获输出?

时间:2014-11-19 00:35:27

标签: python pytest xdist

我使用pytest和pytest-xdist进行并行测试运行。在测试运行时,似乎没有遵守-s选项将标准输出传递给终端。有没有办法让这种情况发生?我意识到这可能会导致不同进程的输出在终端中混乱,但我对此感到满意。

2 个答案:

答案 0 :(得分:1)

我找到了一种解决方法,虽然不是完整的解决方案。通过将stdout重定向到stderr,将显示print语句的输出。这可以通过一行Python代码来完成:

sys.stdout = sys.stderr

如果置于conftest.py中,则适用于所有测试。

答案 1 :(得分: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"类型。