在 pytest(3.04;python 3.4)中,我试图在某些情况下禁用输出捕获。我正在尝试按照 this doc page 上的示例进行操作.但是,我无法将 capsys 指定为 funcarg。作为后续行动,我想接受 funcarg 和 on-funcarg 参数,这样我就可以使用带有一个或多个普通参数的类方法。我怎样才能做到这一点?
理想情况下,此类方法会起作用:
def always_print(self, message, capsys):
with capsys.disabled():
print(message)
但是,我什至无法让它工作:
def always_print(capsys):
with capsys.disabled():
print('FIXME')
获取错误:
...
> always_print()
E TypeError: always_print() missing 1 required positional argument: 'capsys'
编辑 1: Piotr 的回答解决了我的具体问题。但是,我还发现了两个我没有在文档或其他帖子中发现的重要警告,因此在这里分享以供他人使用:
- capsys.disabled() 似乎只适用于 stdout 而不 stderr,这是我最初根据 *nix 最佳实践发送调试消息的地方。
- 如果您在调用 capsys.disabled() 之前将文件句柄设置为 sys.stdout,那么由于 pytest 进行的魔术文件描述符重整,这将不起作用。
因此,例如,您需要这样做(例如,如果您的 kwargs 可能包含一个可选的"file"关键字,就像内置的 print() 那样:
fhandle = kwargs.get('file', sys.stdout) #will not work!
with capsys.disabled():
fhandle = kwargs.get('file', sys.stdout) #must be in context
print(message, file=fhandle)
最佳答案
好吧,capsys
是用于测试的内置 fixture 。您应该将其作为测试的参数获取并进一步传递
def always_print(capsys):
with capsys.disabled():
print('FIXME')
def test_always_print(capsys):
always_print(capsys)
如果您使用 pytest
命令运行它,它将起作用。
编辑:
为避免冗长,您可以为所有测试准备一些全局 capsys
变量(基于答案 how to share a variable across modules for all tests in py.test ):
# globals.py
capsys = None
# conftest.py
import pytest
import globals as gbl
from _pytest.capture import capsys
@pytest.fixture(autouse=True)
def populate_globals(request):
gbl.capsys = capsys(request)
# my_tests.py
import globals as gbl
def test_foo():
with gbl.capsys.disabled():
print('You can see me')
def test_bar():
with gbl.capsys.disabled():
print('You can see me too')
关于python - 在 pytest 中,如何暂时禁用类方法中的捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41794888/