pytest stdout从测试输出中刷新到不同的文件

时间:2017-06-21 08:23:53

标签: python stdout 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.log 包含测试运行的信息, log2.log 包含所有打印件,但 log2.log < / b>是空的

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:\Stefans\01.Learning_Python\27.pytest_std_ouput, inifile:
collected 2 items

tests.py .

========================== 1 passed in 0.01 seconds ===========================

log2.log 的内容:文件为空

期望 log2.log 内容:

Start
End
OK

所以我的问题是我做错了什么,如何让它以这种方式工作,谢谢你。

1 个答案:

答案 0 :(得分:1)

我猜想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. 使用合适的记录器框架。
  4. 尽管3是最大的努力,取决于你想要达到的目标,我相信这是最好的解决方案。