python - 在 pytest 中,如何暂时禁用类方法中的捕获?

标签 python python-3.x testing pytest

在 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 的回答解决了我的具体问题。但是,我还发现了两个我没有在文档或其他帖子中发现的重要警告,因此在这里分享以供他人使用:

  1. capsys.disabled() 似乎只适用于 stdout 而 stderr,这是我最初根据 *nix 最佳实践发送调试消息的地方。
  2. 如果您在调用 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/

相关文章:

python - 在每次迭代期间将新值附加到列表后,将列表值添加到字典中

python - Flask-Limiter 不适用于基于 Flask-Restful API 的应用程序

python - 使用 Python 将 CSV 转换为 JSON(特定格式)

ruby-on-rails - 如果快速规范通过,如何让守卫只运行慢速规范

ruby-on-rails - 如果没有 any_instance,如何断言没有进行方法调用?

reactjs - 使用快照进行 React 测试

Python - 计算 2 的整数次方数的 log2(int) 的最快方法

python - 终止条件为 `left < right` 时的二分查找,步长更新为 `left = mid +1, right = mid`

python - 如何使用按钮销毁程序中当前打开的每个屏幕

python - 在 python 中计算到你下一个生日的天数