Python pytest能否捕获doctest的输出?

Python pytest能否捕获doctest的输出?,python,pytest,doctest,Python,Pytest,Doctest,我使用--doctest模块运行pytest,没有其他选项 我有一个doctest测试失败,我正试图通过在底层代码中添加print()语句来调试这个问题 对于我的常规(非doctest)测试,捕获输出正在正常工作并按预期显示,但是doctest测试没有在我的pytest输出中显示stdout,即使我在那里有print()语句 我可以将我的doctest重新编写为非doctest测试,以便让那些print()语句顺利通过,但这听起来像是一件非常迂回的事情 有没有办法告诉pytest我也希望它捕获d

我使用
--doctest模块运行
pytest
,没有其他选项

我有一个
doctest
测试失败,我正试图通过在底层代码中添加
print()
语句来调试这个问题

对于我的常规(非
doctest
)测试,捕获输出正在正常工作并按预期显示,但是
doctest
测试没有在我的
pytest
输出中显示stdout,即使我在那里有
print()
语句

我可以将我的
doctest
重新编写为非
doctest
测试,以便让那些
print()
语句顺利通过,但这听起来像是一件非常迂回的事情

有没有办法告诉
pytest
我也希望它捕获
doctest
s的输出

$ python --version
Python 3.7.2
$ pytest --version
This is pytest version 3.10.1, imported from /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/pytest.py
setuptools registered plugins:
  pytest-xdist-1.26.1 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/xdist/plugin.py
  pytest-xdist-1.26.1 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/xdist/looponfail.py
  pytest-pythonpath-0.7.3 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/pytest_pythonpath.py
  pytest-mock-1.10.0 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/pytest_mock.py
  pytest-forked-1.0.1 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/pytest_forked/__init__.py
  hypothesis-4.4.1 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/hypothesis/extra/pytestplugin.py
  flaky-3.5.3 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/flaky/flaky_pytest_plugin.py

将我的评论转化为答案:最简单的方法是将stderr打印为
doctest
仅捕获stdout进行比较。例如:

import sys


def greet(who):
    """Greet someone.

    >>> greet('world')
    'Hello world'

    >>> greet('fizz')
    'Hello fizz'

    >>> greet('buzz')
    'Hello buzz'
    """

    print('input:', who, file=sys.stderr)
    return f'Hello {who}'
运行测试:

$ pytest --doctest-modules -sv
======================================= test session starts ========================================
...
collected 1 item                                                                                   

spam.py::spam.greet input: world
input: fizz
input: buzz
PASSED

===================================== 1 passed in 0.03 seconds =====================================

最简单的方法是将stderr打印为
doctest
仅捕获stdout进行比较
print('debug stuff',file=sys.stderr)
等等。当然,您仍然应该运行
pytest-s
来捕获输出。