pytest 标准输出与测试输出刷新到不同的文件



这里有 tests.py 包含:

import sys
sys.stdout = open('log2.log', 'w')

class TestH5Client:
    def test_something(self):
        print("Start")
        assert True
        print("End")
    def teardown_class(cls):
        print("OK")

我正在使用以下 shell 命令运行我的测试

pytest tests.py::TestH5Client::test_something >>log.log

我希望该日志.log包含测试运行和log2的信息.log包含所有打印,但log2.log为空

日志的内容.log(内容是我所期望的(:

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.1.0, py-1.4.33, pluggy-0.4.0
rootdir: C:Stefans1.Learning_Python27.pytest_std_ouput, inifile:
collected 2 items
tests.py .
========================== 1 passed in 0.01 seconds ===========================

log2.log的内容:文件为空

log2.log 内容的预期:

Start
End
OK

所以我的问题是我做错了什么,我怎样才能让它以这种方式工作,提前谢谢你。

我猜 py.test 的默认选项是通过覆盖 sys.stdout 来捕获 al 输出,取消您的代码以覆盖 sys.stdout。

我已经测试了三个似乎可以解决您问题的选项:

  1. 您可以覆盖打印功能,而不是覆盖sys.stdout,例如print = lambda x: open('log2.log', 'a').write(str(x)+"n")
    • 不会递归记录打印
    • 启用每个文件日志记录
  2. 您可以通过将 -s 选项添加到执行命令来禁用 py.test 的输出捕获。
    • 将打印所有测试中的所有打印件,也可以递归打印
    • 未转换的打印件可能会使您的log.log文件变得模糊
  3. 使用一个体面的记录器框架。

尽管 3 是最大的努力,但这取决于您想要达到的目标,但我相信这是最好的解决方案。

最新更新