将pytest与xdist一起使用时如何打印输出

Posted

技术标签:

【中文标题】将pytest与xdist一起使用时如何打印输出【英文标题】:How to print output when using pytest with xdist 【发布时间】:2016-08-12 02:35:59 【问题描述】:

我正在使用 py.test 运行测试。我将它与 pytest-xdist 一起使用来并行运行测试。我想在我的测试中查看打印语句的输出。

我有:Ubuntu 15.10、Python 2.7.10、pytest-2.9.1、pluggy-0.3.1。

这是我的测试文件:

def test_a():
    print 'test_a'


def test_b():
    print 'test_b'

当我运行 py.test 时,没有打印任何内容。这是意料之中的:默认情况下,py.test 会捕获输出。

当我运行 py.test -s 时,它应该打印 test_atest_b

当我运行 py.test -s -n2 时,又没有打印任何内容。使用 -n2 时如何使打印语句正常工作?

我已经读过pytest + xdist without capturing output 和这个bug report。

【问题讨论】:

我找到了一个解决方法,虽然不是一个完整的解决方案。通过将 stdout 重定向到 stderr,可以显示打印语句的输出。这可以通过一行 Python 代码来完成:sys.stdout = sys.stderr。如果放在 conftest.py 中,它适用于所有测试。 ***.com/q/27006884/151641 中的更完整答案,还可以查看链接到那里的 GitHub 问题 (github.com/pytest-dev/pytest/issues/680) 另见github.com/pytest-dev/pytest/issues/5586 【参考方案1】:

我刚刚在 github https://github.com/pytest-dev/pytest/issues/1693看到了关于这个问题的解释

pytest-xdist 使用 sys stdin/stdout 来控制执行, 显示打印输出的唯一方法应该是 std.err。

import sys
def test_a():
    print >> sys.stderr, 'test_a'


def test_b():
    print >> sys.stderr, 'test_b'

不是一个好主意,但工作。

另外你应该注意,如果你使用 xdist 插件,arg -s 是没有用的。


python 3 中,我认为logging.warning 是更好的选择,因为它默认设置为写入 stderr。

import logging
logging.basicConfig(format='%(message)s')

def test_a():
    logging.warning('test_a')


def test_b():
    logging.warning('test_b')

要查看日志文件,请创建一个名为 pytest.ini 的文件并将以下内容添加到其中

log_cli = 1
log_cli_level = WARN
log_file = ./TestResults/test_log.log
log_file_level = WARN 

【讨论】:

我尝试过这种方式,但有几个问题: 1. 终端输出中未显示消息。 2. 不同worker覆盖日志文件,日志中只写入最后几条消息。

以上是关于将pytest与xdist一起使用时如何打印输出的主要内容,如果未能解决你的问题,请参考以下文章

pytest学习和使用20-pytest如何进行分布式测试?(pytest-xdist)

pytest-27-pytest分布式执行(pytest-xdist)

pytest文档27-pytest分布式执行(pytest-xdist)

46-pytest-分布式插件pytest-xdist使用

pytest-xdist 分布式执行用例

pytest 内置插件