如何查看pytest运行期间创建的普通打印输出?

问题描述 投票:321回答:8

有时,我只想在代码中插入一些打印语句,然后查看在执行该操作时打印出来的内容。我通常的“锻炼”方式是使用现有的pytest测试。但是,当我运行这些命令时,我似乎看不到任何标准输出(至少从我的IDE PyCharm内部)。

是否有一种简单的方法可以在pytest运行期间查看标准输出?

python logging output pytest
8个回答
454
投票

-s switch禁用每次测试捕获。


48
投票

-supvoted comment中,accepted answer问:

有什么方法可以打印到控制台上吗?[[AND捕获输出以使其显示在junit报告中?

在UNIX中,通常称为Joe。理想情况下,py.test默认是发球而不是捕获。尽管Python很少支持tee teeing,但py.test或任何现有的第三方py.test插件(...

无论如何,我都知道

)都不支持tee。Monkey-patching py.test to do

anything

不被支持是不平凡的。为什么?因为:
    大多数py.test功能被锁定在打算从外部导入的私有out-of-the-box
  • not后面。尝试不知道自己在做什么通常会导致公共_pytest程序包在运行时引发模糊的异常。 非常感谢,py.test。您达到的真正强大的体系结构。
即使您
  • do
  • 弄清楚如何以安全的方式对专用pytest API进行猴子补丁,您也必须这样做[[之前
    运行由外部[ C0]命令。您无法在插件中执行此操作(例如,测试套件中的顶级_pytest模块)。到py.test懒惰地动态导入插件时,您想要进行猴子补丁的任何py.test类都已被实例化很久了,并且您[可以访问该实例。这意味着,如果您希望有意义地应用猴子补丁,则无法再安全地运行外部pytest命令。相反,您必须使用自定义setuptools py.test命令(按顺序)来包装该命令的运行:Monkey修补专用conftest API。调用公共py.test函数以运行test命令。
      此答案用于修补py.test的_pytestpytest.main()选项,以捕获stderr但
    1. not stdout。默认情况下,这些选项既不捕获stderr也不捕获stdout。当然,这还不够。但是,每一次伟大的旅程都始于一个繁琐的前传,五年后每个人都会忘记。
  • 为什么这样做?我现在告诉你。我的py.test驱动的测试套件包含缓慢的功能测试。显示这些测试的标准输出将很有帮助且令人放心,当另一个长时间运行的功能测试连续数周都无法执行任何操作时,可以防止py.test达到-s。但是,显示这些测试的stderr可以防止py.test报告有关测试失败的异常回溯。这是完全没有帮助的。因此,我们强制py.test捕获stderr但

    not

    stdout。
  • [在开始之前,此答案假设您已经具有调用py.test的自定义setuptools --capture=no命令。如果不这样做,请参见py.test编写良好的leycec页面的killall -9 py.test小节。

    执行

    安装test,这是第三方setuptools插件,提供了自定义setuptools Manual Integration命令,也调用了py.test。如果已经安装了pytest-runner,则可能需要卸载该pip3软件包,然后采用上面链接的手动方法。

    假设您按照上面突出显示的Good Practices中的说明进行操作,则您的代码库现在应包含pytest-runner方法。修改此方法使其类似:

    test

    要启用此猴子补丁,请按以下方式运行py.test:

    Manual Integration

    现在将捕获
    Stderr但是

    not

    stdout。漂亮!
    将上面的猴子补丁扩展到tee stdout和stderr,作为练习,留给读者一整桶的空闲时间。

    25
    投票

    25
    投票

    13
    投票
    [py.test exampletest.py -s

    3
    投票

    使用'-r'选项显示额外的摘要信息:


    0
    投票
    显示通过测试的捕获输出。

    --verbose

    显示捕获的失败测试输出(默认行为)。

    [-r的输出格式比-s的输出格式漂亮。


    -3
    投票
    © www.soinside.com 2019 - 2024. All rights reserved.