将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_a 和 test_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)